sqlite3恰好在SQLITE_BUSY状态下的数据库

时间:2014-08-12 11:20:48

标签: c++ sqlite

对于其他线程和进程,sqlite3数据库的确属于SQLITE_BUSY状态。 (默认模式下的数据库SERIALIZEnot WAL

简单示例来说明问题:

char buffer[] = "SELECT sessionid FROM sessions WHERE something < 1000";
sqlite3_prepare_v2(db, buffer, strlen(buffer), &stmt, 0)

// IS DB SQLITE_BUSY HERE ? PLACE 1

while( sqlite3_step(stmt) == SQLITE_ROW )
{
 // IS DB SQLITE_BUSY HERE ? PLACE 2
}

 // IS DB STILL SQLITE_BUSY HERE? PLACE 3
sqlite3_finalize(stmt);

1 个答案:

答案 0 :(得分:0)

我知道sqlite3_prepare_v2sqlite3_step都可能会错误地发送SQLITE_BUSY(文档会这样说,而且我已经多次遇到过它)。对于sqlite3_finalize,文档不太清楚,但我的印象是sqlite3_finalize仅用于内存管理,因此它不应该进行任何数据库访问。

sqlite3_step是最有可能发生这种情况的地方,因为它实际上是执行"INSERT INTO...""COMMIT"之类的事情,而这些事情在数据库上往往很重。

在并发方面,SQLite并不是非常有用。默认情况下,它甚至不提供任何公平性保证(尽管只要您的并发发生在同一个过程中,您就可以自己编写它们。)