我正在 WAL 模式下运行 SQLite。
我有 2 个进程,连接为“X”和“Y”。以下事情按顺序发生:
(在我的设置中,我可以确保读事务在写事务通过 SQLite 外部的方式完成后开始,即通过在两个进程之间发送一些信号,但仅在成功写入之后)
问题:我能否确定连接 Y 上的读取事务包含连接 X 中写入的结果?
文档中包含最佳提示的部分是
WAL 模式允许同时读取和写入。 [..] 在 WAL 模式下,SQLite 表现出“快照隔离”。当读取事务开始时,该读取器将继续看到数据库文件不变的“快照”,因为它在读取事务开始时就存在。
(来自 https://www.sqlite.org/isolation.html)
这可以理解为对我原来的问题的“是”,但前提是“目前存在”意味着“包括所有已提交的交易”。不过,后一部分在引文中并没有(完全)明确。
根据 SQLite 文档,当使用预写日志记录 (WAL) 模式时,SQLite 表现出“快照隔离”。这意味着当读取事务开始时,读取器将继续看到数据库文件不变的“快照”,因为它在读取事务开始时就存在。
在您的场景中,由于您确保连接 Y 中的读取事务仅在连接 X 中的写入事务成功完成后才开始,因此 SQLite 的快照隔离保证连接 Y 中的读取事务确实会包含连接中已提交的写入事务的结果X.
所以,是的,您可以确定连接 Y 上的读取事务将包含连接 X 中的写入结果。