[英]PostgreSQL transaction level guarantees for foreign key consistency in read only transactions
应用程序A (想想导出器)需要从正在运行的 PostgreSQL 数据库中读取所有表的所有行。 同时应用程序B (想想 web 应用程序)继续进行读写。
表child
对parent
有一个可选的外键。
我在使用以下访问模式时遇到了问题:
BEGIN TRANSACTION
SELECT * FROM parent
BEGIN TRANSACTION
INSERT INTO parent
级INSERT INTO child -- has foreign key to inserted parent
COMMIT
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
行?parent
无效引用的child
行?开始交易A
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
然后,该事务中的所有语句都将看到数据库的相同 state(快照),无论并发事务修改了什么。
我添加READ ONLY
只是因为您说 A 是,它没有必要工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.