从多个进程和SQLITE_BUSY访问SQLite数据库

时间:2016-04-01 19:14:07

标签: c++ windows multithreading sqlite

我有多个使用相同SQLite数据库的进程(c ++,Windows 8)。我使用SQLITE_CONFIG_SERIALIZEDPRAGMA busy_timeout = 60000;配置了连接。使用的日记记录模式 - DELETE

测试场景:

  • 进程#1打开连接,进行读/写,休眠5秒
  • 进程#2打开连接,进行读/写

在该进程#1无法写入数据库之后 - 它在调用SQLite API(sqlite3_step,sqlite3_finalize)后立即收到SQLITE_BUSY。进程#2仍然使用连接而没有任何问题。

我没有任何未关闭的交易,我对数据库没有任何长期操作。还有什么可以导致这个?

我使用来自进程内多个线程的相同SQLite连接。 SQLite文档说配置选项SQLITE_CONFIG_SERIALIZED就可以了。这条规则有什么例外吗?

1 个答案:

答案 0 :(得分:0)

SQLite获取sqlite3_prepare中数据库/表的锁定,并在sqlite3_finalize中释放它。锁的类型取决于您的SQL表达式。

如果您创建了STMT - 您需要执行它并尽快完成。否则你会阻止不同的连接。

我的应用程序创建了准备好的STMT列表并将其保留到最后。通常这是滥用SQLite。

链接: