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

时间:2015-05-06 15:46:11

标签: sqlite locked

我使用sashite3命令行,来自bash。

我产生了多个进程,所有进程都试图插入到同一个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 &

我尝试添加PRAGMA busy_timeout = 2000;和PRAGMA locking_mode = EXCLUSIVE;为了它,但它没有帮助。

sqlite3 -version
3.8.9 2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09

2 个答案:

答案 0 :(得分:4)

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

以下适用于我(没有busy_timeout会导致错误):

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

答案 1 :(得分:3)

有一个good answer for this problem on DBA StackExchange。归结为在初始化时运行.timeout 1000告诉命令行工具等待1秒钟以获取锁定。我不确定此超时是否与您引用的pragma busy_tmeout相同,或者它是否不同。