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

SQLite返回以下错误:

SQL error: database is locked

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


当前回答

我在应用程序中有这样的问题,从2个连接访问SQLite -一个是只读的,第二个用于写入和读取。看起来这个只读连接阻止了第二个连接的写入。最后,需要在使用后立即完成或至少重置准备好的语句。直到准备语句被打开,导致数据库写入被阻塞。

别忘了打电话:

sqlite_reset(xxx);

or

sqlite_finalize(xxx);

其他回答

我在Mac OS X 10.5.7上从终端会话运行Python脚本时遇到了同样的问题。尽管我已经停止了脚本,并且终端窗口位于命令提示符处,但它在下次运行时仍然会给出这个错误。解决方案是关闭终端窗口,然后再次打开它。我觉得没道理,但奏效了。

SQLite db文件只是文件,所以第一步是确保它不是只读的。另一件要做的事情是确保在DB打开时没有某种GUI SQLite DB查看器。可以在另一个shell中打开DB,也可以在代码中打开DB。通常情况下,如果不同的线程或应用程序(如SQLite Database Browser)打开了数据库以便写入,则会看到这种情况。

这是因为该数据库上正在运行其他一些查询。SQLite是一个同步执行查询的数据库。如果其他人正在使用该数据库,那么如果你执行查询或事务,它就会给出这个错误。

因此,停止正在使用特定数据库的进程,然后执行查询。

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

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

我在应用程序中有这样的问题,从2个连接访问SQLite -一个是只读的,第二个用于写入和读取。看起来这个只读连接阻止了第二个连接的写入。最后,需要在使用后立即完成或至少重置准备好的语句。直到准备语句被打开,导致数据库写入被阻塞。

别忘了打电话:

sqlite_reset(xxx);

or

sqlite_finalize(xxx);