繁体   English   中英

PostgreSQL 事务级别保证只读事务中的外键一致性

[英]PostgreSQL transaction level guarantees for foreign key consistency in read only transactions

应用程序A (想想导出器)需要从正在运行的 PostgreSQL 数据库中读取所有表的所有行。 同时应用程序B (想想 web 应用程序)继续进行读写。

childparent有一个可选的外键。

我在使用以下访问模式时遇到了问题:

  • A : BEGIN TRANSACTION
  • A : SELECT * FROM parent
  • B : BEGIN TRANSACTION
  • BINSERT INTO parent
  • B : INSERT INTO child -- has foreign key to inserted parent
  • BCOMMIT
  • 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

START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;

然后,该事务中的所有语句都将看到数据库的相同 state(快照),无论并发事务修改了什么。

我添加READ ONLY只是因为您说 A 是,它没有必要工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM