我从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)
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)
这个问题在 DBA StackExchange 上有一个很好的答案。归结为.timeout 1000在初始化时运行以告诉命令行工具等待 1 秒以获取锁。我不确定此超时是否与pragma busy_tmeout您引用的相同或不同。
| 归档时间: |
|
| 查看次数: |
13017 次 |
| 最近记录: |