使用sqlite3命令行时,sqlite错误数据库被锁定

Dmi*_*y z 6 sqlite locked

我从bash使用sqlite3命令行.

我产生了多个进程,都试图插入到同一个sqlite数据库文件中.

我经常得到"数据库被锁定".

根据我对文档的阅读(http://www.sqlite.org/cvstrac/wiki?p=DatabaseIsLocked),这绝不应该发生:"SQLITE_LOCKED意味着争用的来源是内部的,来自接收到的相同的数据库连接SQLITE_LOCKED错误".

sqlite3命令行是单线程的,所以在这种情况下我会期望SQLITE_BUSY,但不是SQLITE_LOCKED.

码:

doit() {
   sqlite3 /tmp/db "insert into foo(a,b,c) values(1,2,3);
}

doit &; doit &; doit &
Run Code Online (Sandbox Code Playgroud)

我尝试添加PRAGMA busy_timeout = 2000; 和PRAGMA locking_mode = EXCLUSIVE; 对于它,但它没有帮助.

sqlite3 -version
3.8.9 2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09
Run Code Online (Sandbox Code Playgroud)

CL.*_*CL. 5

SQLITE_BUSY的错误消息 “数据库已锁定”;SQLITE_LOCKED将为“数据库表已锁定”。

以下对我有用(其中否busy_timeout会导致错误):

doit() {
   sqlite3 /tmp/db "pragma busy_timeout=20000; insert into foo(a,b,c) values(1,2,3);"
}
Run Code Online (Sandbox Code Playgroud)


Nel*_*son 5

这个问题在 DBA StackExchange 上有一个很好的答案。归结为.timeout 1000在初始化时运行以告诉命令行工具等待 1 秒以获取锁。我不确定此超时是否与pragma busy_tmeout您引用的相同或不同。