对于其他线程和进程,sqlite3数据库将处于SQLITE_BUSY状态。(默认模式为SERIALIZE、not 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);发布于 2014-08-12 22:00:34
我知道一个事实,sqlite3_prepare_v2和sqlite3_step在使用SQLITE_BUSY时都会出错(文档上这么说,我已经遇到过很多次了)。sqlite3_finalize的文档不太清楚,但我的印象是sqlite3_finalize只是用于内存管理,所以它不应该进行任何数据库访问。
sqlite3_step是最有可能发生这种情况的地方,因为它实际上执行的是"INSERT INTO..."和"COMMIT"之类的事情,这些事情往往会对数据库造成很大的负担。
当涉及到并发性时,SQLite并不是非常有用。默认情况下,它甚至不提供任何公平性保证(尽管只要并发发生在同一进程中,您就可以自己编写)。
https://stackoverflow.com/questions/25262971
复制相似问题