【问题标题】:sqlite error database is locked when using sqlite3 command line使用 sqlite3 命令行时,sqlite 错误数据库被锁定
【发布时间】:2015-07-16 21:01:11
【问题描述】:

我使用来自 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 &

我尝试添加 PRAGMA busy_timeout=2000;和 PRAGMA lock_mode=EXCLUSIVE;见鬼,但它没有帮助。

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

【问题讨论】:

    标签: sqlite locked


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯。你可能是对的。称之为消息混乱。我现在可以通过以下任一方法实现相同的效果: sqlite3 -init
    • .timeout 完全一样。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2018-06-11
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2013-04-18
      相关资源
      最近更新 更多