PostgreSQL 事务级别保证只读事务中外键的一致性
PostgreSQL transaction level guarantees for foreign key consistency in read only transactions
应用程序 A(认为导出器)需要从 运行 PostgreSQL 数据库中读取所有 tables 的所有行。同时,应用程序 B(想想 Web 应用程序)继续进行读写操作。
Table child
有一个可选的外键到 parent
。
我在使用以下访问模式时遇到了问题:
- A:
BEGIN TRANSACTION
- A:
SELECT * FROM parent
- B:
BEGIN TRANSACTION
- B:
INSERT INTO parent
- B:
INSERT INTO child -- has foreign key to inserted parent
- B:
COMMIT
- A:
SELECT * FROM child -- I do not want to receive the inserted child here
应用程序 A 中断,因为它读取了无法读取 parent
的 child
。因此我不希望 A 读取 B.
插入的 child
行
据我了解,REPEATABLE_READ
在这里没有给我任何保证,因为我还没有阅读此交易中的 child
table。据我了解,出于同样的原因,这也不被视为幻读。
SERIALIZABLE
是否保证 A 不读取新的 child
行?
- 我是否需要借助 A 中的应用程序逻辑来丢弃
child
行对 parent
的无效引用?
用
开始交易A
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
然后该事务中的所有语句将看到数据库的相同状态(快照),无论并发事务修改了什么。
我添加READ ONLY
只是因为你说A是,它没有必要工作。
应用程序 A(认为导出器)需要从 运行 PostgreSQL 数据库中读取所有 tables 的所有行。同时,应用程序 B(想想 Web 应用程序)继续进行读写操作。
Table child
有一个可选的外键到 parent
。
我在使用以下访问模式时遇到了问题:
- A:
BEGIN TRANSACTION
- A:
SELECT * FROM parent
- B:
BEGIN TRANSACTION
- B:
INSERT INTO parent
- B:
INSERT INTO child -- has foreign key to inserted parent
- B:
COMMIT
- A:
SELECT * FROM child -- I do not want to receive the inserted child here
应用程序 A 中断,因为它读取了无法读取 parent
的 child
。因此我不希望 A 读取 B.
child
行
据我了解,REPEATABLE_READ
在这里没有给我任何保证,因为我还没有阅读此交易中的 child
table。据我了解,出于同样的原因,这也不被视为幻读。
SERIALIZABLE
是否保证 A 不读取新的child
行?- 我是否需要借助 A 中的应用程序逻辑来丢弃
child
行对parent
的无效引用?
用
开始交易ASTART TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
然后该事务中的所有语句将看到数据库的相同状态(快照),无论并发事务修改了什么。
我添加READ ONLY
只是因为你说A是,它没有必要工作。