当我输入这个查询: 删除邮件中id = 71的所有邮件

SQLite返回以下错误:

SQL error: database is locked

我如何解锁数据库,以便这个查询将工作?


当前回答

SQLite wiki DatabaseIsLocked页面提供了此错误消息的解释。在某种程度上,它指出争用的来源是内部的(对发出错误的进程而言)。本页没有解释的是SQLite如何决定进程中的某些东西持有锁,以及哪些条件会导致误报。

当您试图从同一个数据库连接同时对数据库执行两项不兼容的操作时,就会出现此错误代码。


在v3中引入的有关文件锁定的变化可能对未来的读者有用,可以在这里找到:SQLite版本3中的文件锁定和并发性

其他回答

在选择重新启动选项之前,有必要看看能否找到sqlite数据库的用户。

在Linux上,可以使用fuser:

$ fuser database.db

$ fuser database.db-journal

在我的案例中,我得到了如下的回应:

philip    3556  4700  0 10:24 pts/3    00:00:01 /usr/bin/python manage.py shell

这表明我有另一个使用数据库的pid 3556 (manage.py)的Python程序。

我添加了“池=true”连接字符串,它工作。

应该是数据库的内部问题… 对我来说,这是在尝试用“SQLite管理器”浏览数据库后表现出来的… 所以,如果你找不到另一个连接到数据库的进程,你也无法修复它, 试试这个激进的解决方案:

提供导出您的表(您可以在Firefox上使用“SQLite管理器”) 如果迁移改变了数据库方案,请删除上次失败的迁移 重命名“数据库”。sqlite”文件 执行“rake db:migrate”创建一个新的工作数据库 提供给正确的权限数据库表的导入 导入备份的表 编写新的迁移 执行"rake db:migrate"

您可以尝试:.timeout 100来设置超时时间。 我不知道在命令行中发生了什么,但在c# .Net中,当我这样做:“UPDATE table-name SET column-name = value;”我得到数据库被锁定,但这个“UPDATE table-name SET column-name = value”它很好。

看起来,当您添加;,sqlite将寻找进一步的命令。

我导致我的sqlite数据库在写入过程中崩溃一个应用程序而被锁定。以下是我如何修复它:

echo ".dump" | sqlite old.db | sqlite new.db

摘自:http://random.kakaopor.hu/how-to-repair-an-sqlite-database