我有一个使用sqlite3_open打开数据库并将日志模式设置为WAL的进程。
另一个进程,使用sqlite3_open打开同一个数据库。一切似乎都有效,但问题是第二个过程似乎没有看到第一个过程所做的更改。我正在尝试获取计数或者rowid,它们保持不变。
我确信数据库正在更新,因为使用SQLiteDatabaseBrowser刷新会显示更改。
我尝试了多种打开数据库的方法,以及多种查询方式,但到目前为止还没有运气。我错过了什么?谢谢!
答案 0 :(得分:0)
事务用于隔离彼此之间的连接,尤其是在事务完成后才能使更改可见。
因此,要使更改可见,写入连接必须结束其事务,并且读取连接在此之前不得启动自己的事务。 (使用自动事务时,请确保重置或最终确定语句。)
答案 1 :(得分:0)
我弄清楚问题是什么,并且像往常一样,在事情毫无意义的情况下,错误就在我身边。然而问题是微妙的,值得一提。
我懒惰地在缓存的预处理语句上执行sqlite3_reset调用,这是之前的我重用了预处理语句,而不是在我执行它之后立即执行它。问题是这种模式意味着总是准备好语句挂起重置。显然,重置是必要的,以便能够看到数据库的更新(可能正在保留一些互斥锁)。
感谢您的帮助。
编辑:在睡觉之后,这种行为实际上是有道理的。在准备好的语句执行期间,更新不应该是可见的,否则它可能永远不会完成或准确。