当我输入这个查询: 删除邮件中id = 71的所有邮件
SQLite返回以下错误:
SQL error: database is locked
我如何解锁数据库,以便这个查询将工作?
当我输入这个查询: 删除邮件中id = 71的所有邮件
SQLite返回以下错误:
SQL error: database is locked
我如何解锁数据库,以便这个查询将工作?
当前回答
我在多线程应用程序中也有“数据库被锁定”错误,这似乎是SQLITE_BUSY结果代码,我通过将sqlite3_busy_timeout设置为适当的长度(如30000)来解决这个问题。
(顺便说一句,对于一个7年前的问题,居然没有人发现这一点,这真奇怪!SQLite真的是一个奇特而神奇的项目…)
其他回答
您可以尝试:.timeout 100来设置超时时间。 我不知道在命令行中发生了什么,但在c# .Net中,当我这样做:“UPDATE table-name SET column-name = value;”我得到数据库被锁定,但这个“UPDATE table-name SET column-name = value”它很好。
看起来,当您添加;,sqlite将寻找进一步的命令。
我的锁是由系统崩溃引起的,而不是由挂起进程引起的。为了解决这个问题,我简单地重命名了文件,然后将其复制回原来的名称和位置。
使用Linux shell将是:
mv mydata.db temp.db
cp temp.db mydata.db
从您之前的评论中,您说存在一个-journal文件。
这可能意味着您已经打开和(EXCLUSIVE?)事务,还没有提交数据。是你的程序或者其他进程留下了-journal吗?
重新启动sqlite进程将查看日志文件,清除任何未提交的操作并删除-journal文件。
SQLite db文件只是文件,所以第一步是确保它不是只读的。另一件要做的事情是确保在DB打开时没有某种GUI SQLite DB查看器。可以在另一个shell中打开DB,也可以在代码中打开DB。通常情况下,如果不同的线程或应用程序(如SQLite Database Browser)打开了数据库以便写入,则会看到这种情况。
我有一个工具“DB Browser for SQLite”正在运行,也在里面工作。显然,这个工具也会锁上东西。 在点击“写入更改”或“恢复更改”后,锁消失了,另一个进程(一个React-Native脚本)不再给出这个错误。