【发布时间】:2021-06-22 17:11:38
【问题描述】:
应用程序A(想想导出器)需要从正在运行的 PostgreSQL 数据库中读取所有表的所有行。与此同时,应用程序B(想想网络应用程序)继续进行读写操作。
表child 有一个parent 的可选外键。
我在使用以下访问模式时遇到了问题:
-
A:
BEGIN TRANSACTION -
A:
SELECT * FROM parent -
乙:
BEGIN TRANSACTION -
乙:
INSERT INTO parent -
乙:
INSERT INTO child -- has foreign key to inserted parent -
乙:
COMMIT -
A:
SELECT * FROM child -- I do not want to receive the inserted child here
应用程序 A 中断,因为它读取了无法读取 parent 的 child。因此,我不希望 A 读取 B 插入的 child 行。
据我了解,REPEATABLE_READ 在这里没有给我任何保证,因为我还没有阅读此事务中的child 表。据我了解,出于同样的原因,这也不被视为幻读。
-
SERIALIZABLE是否保证 A 不会读取新的child行? - 我是否需要借助 A 中的应用程序逻辑来丢弃具有对
parent的无效引用的child行?
【问题讨论】:
-
如果 A 在可重复读取中运行,它将看不到事务开始后插入的任何新(或更改或删除)行。
标签: postgresql isolation-level transaction-isolation