Database 并发开始–;选择–;插入“SQLite3.7.6”;“数据库已锁定”-错误,是否覆盖忙超时?

Database 并发开始–;选择–;插入“SQLite3.7.6”;“数据库已锁定”-错误,是否覆盖忙超时?,database,concurrency,transactions,sqlite,Database,Concurrency,Transactions,Sqlite,在sqlite3控制台中: sqlite> CREATE TABLE items (id PRIMARY KEY); BEGIN; SELECT * FROM items; INSERT INTO items VALUES(78); sqlite> _ 然后在第二个控制台中: sqlite> .timeout 10000; BEGIN; SELECT * FROM items; INSERT INTO items

sqlite3
控制台中:

sqlite>
    CREATE TABLE items (id PRIMARY KEY);
    BEGIN;
    SELECT * FROM items;
    INSERT INTO items VALUES(78);
sqlite> _
然后在第二个控制台中:

sqlite>
    .timeout 10000;
    BEGIN;
    SELECT * FROM items;
    INSERT INTO items VALUES(78);
Error: database is locked
sqlite> _
“数据库被锁定”-错误立即发生,这不可能是正确的,对吗

如果我省略了第二个控制台中的SELECT,繁忙的处理程序将在插入时等待10秒钟。我发现,使用
beginexclusive
也会使第二个事务等待10秒,然后在BEGIN语句处等待。(我已决定将其作为一种解决办法。)

我的问题:这是一个bug,还是应该是?如果这是预期的行为,那么为什么

谢谢


(SQLite v3.7.6)

是,这是正常的。请阅读:

第二个事务在第一个事务释放其写锁之前无法完成,而第一个事务在第二个事务释放其读锁之前无法完成。因此,立即回滚第二个是有意义的,因为它不能在任何时间内完成,所以第一个可以完成,您可以再试一次

BEGIN EXCLUSIVE
立即获取独占锁,而不是等待第一次查询,这解释了您看到的差异

在事务中,您应该注意锁定的数据库(
SQLITE\u BUSY
),如果发生这种情况,请回滚并重试。超时忙处理程序不会保护这些