SQLite(WAL 模式):保证后续读取事务中已提交写入的可用性

问题描述 投票:0回答:1

我正在 WAL 模式下运行 SQLite。

我有 2 个进程,连接为“X”和“Y”。以下事情按顺序发生:

  • 在连接 X 中,提交了写入事务
  • 在连接 Y 中,启动读取事务

(在我的设置中,我可以确保读事务在写事务通过 SQLite 外部的方式完成后开始,即通过在两个进程之间发送一些信号,但仅在成功写入之后)

问题:我能否确定连接 Y 上的读取事务包含连接 X 中写入的结果?

文档中包含最佳提示的部分是

WAL 模式允许同时读取和写入。 [..] 在 WAL 模式下,SQLite 表现出“快照隔离”。当读取事务开始时,该读取器将继续看到数据库文件不变的“快照”,因为它在读取事务开始时就存在。

(来自 https://www.sqlite.org/isolation.html

这可以理解为对我原来的问题的“是”,但前提是“目前存在”意味着“包括所有已提交的交易”。不过,后一部分在引文中并没有(完全)明确。

sqlite transactions
1个回答
0
投票

根据 SQLite 文档,当使用预写日志记录 (WAL) 模式时,SQLite 表现出“快照隔离”。这意味着当读取事务开始时,读取器将继续看到数据库文件不变的“快照”,因为它在读取事务开始时就存在。

在您的场景中,由于您确保连接 Y 中的读取事务仅在连接 X 中的写入事务成功完成后才开始,因此 SQLite 的快照隔离保证连接 Y 中的读取事务确实会包含连接中已提交的写入事务的结果X.

所以,是的,您可以确定连接 Y 上的读取事务将包含连接 X 中的写入结果。

© www.soinside.com 2019 - 2024. All rights reserved.