我使用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
答案 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
相同,或者它是否不同。