从多个进程和SQLite_BUSY访问SQLite数据库
Accessing SQLite database from multiple processes and SQLITE_BUSY
我有多个进程(c++、Windows 8)使用相同的SQLite数据库。我配置了与SQLITE_CONFIG_SERIALIZED
和PRAGMA 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锁定
相关文章:
- 查询SQLite数据库中的日期
- 带内存和隔离功能的SQLite
- Qt SQLite没有查询或参数计数不匹配
- Qt SQlite无法创建表
- 数数并选择 sqlite 中的前三名
- 如何使用SQLite将数据库中的值导出为C / C++中的字符串或字符?
- 如何使用SQLite在qt中创建表?
- 使用 cl 构建代码并连接到 sqlite 库
- 连接到 URL Sqlite 数据库C++
- protobuf C++ SQLite handle blob data
- 损坏的结构字符数组 - sqlite C++
- 使用 SQlite 在 QT5 上关闭和打开数据库时出错
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- 如何使用C ++将SQLite数据库中的所有表从一个数据库复制到另一个数据库
- 优化使用 C++ 查询 SQLite DB 中超过 5000 万条数据记录的方式
- POST Arduino 传感器值通过 Flask API 发送到本地 Sqlite db
- 将数据从 SQLite 数据库保存到变量中
- QT Creator将SQLite复制为空数据库
- c++中的SQLite.数据库是BUSY(多线程)