准备"选择"状态时,SQLite DB(带WAL)被锁定 - 为什么?

Str*_*tch 7 c++ sqlite

我看到我的读取被处于WAL模式的数据库写入阻止 - 我很难过为什么.

我的设置:

  • SQLite3数据库,journal_mode = WAL,同步= NORMAL
  • 多个C++进程(确切地说是3个)使用数据库 - 这些进程中的任何方法都打开和关闭它们自己的非共享连接sqlite3_open_v2.
  • 插入数据的方法在SQLITE_OPEN_READWRITE模式下打开db
  • 从数据库中读取的方法(即只执行select语句)在SQLITE_OPEN_READONLY模式下打开db

在WAL模式下,我相信应该可以在写入时发生并发读取.

然而,当我准备使用select语句时,我看到"数据库被锁定" sqlite3_prepare_v2

我可能做错了什么导致读者被阻止?我误解了"读"实际上是什么吗?

任何提示赞赏,

谢谢 :)

小智 1

检查每个 sqlite3_step 之后是否有 sqlite3_reset,因为这是导致数据库锁定错误的一种情况。在使用 sqlite3_prepare 准备一条语句并使用 sqlite3_step 执行它之后,您始终需要使用 sqlite3_reset 重置它。

sqlite3_reset(S) 接口将准备好的语句 S 重置回其程序的开头。

希望这能解决您的问题...!!!