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

Accessing SQLite database from multiple processes and SQLITE_BUSY

本文关键字:SQLite BUSY 访问 数据库 进程      更新时间:2023-10-16

我有多个进程(c++、Windows 8)使用相同的SQLite数据库。我配置了与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可以这样做。这个规则有例外吗?

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

如果你创建了一个STMT,你需要尽快执行并完成它。否则会阻塞不同的连接。

我的应用程序创建了准备好的STMT列表,并一直保存到最后。一般来说,这是对SQLite的滥用。

链接:

  • SQLite锁定