8

我看到我的读取被 WAL 模式下的数据库写入阻止了 - 我不知道为什么。

我的设置:

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

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

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

我可能做错了什么导致读者被阻止?我是否误解了“阅读”实际上是什么?

任何提示表示赞赏,

谢谢 :)

4

1 回答 1

1

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

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

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

于 2013-02-19T10:08:54.213 回答