【问题标题】:PostgreSQL transaction level guarantees for foreign key consistency in read only transactionsPostgreSQL 事务级别保证只读事务中的外键一致性
【发布时间】:2021-06-22 17:11:38
【问题描述】:

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

child 有一个parent 的可选外键。

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

  • ABEGIN TRANSACTION
  • ASELECT * FROM parent
  • BEGIN TRANSACTION
  • INSERT INTO parent
  • INSERT INTO child -- has foreign key to inserted parent
  • COMMIT
  • ASELECT * FROM child -- I do not want to receive the inserted child here

应用程序 A 中断,因为它读取了无法读取 parentchild。因此,我不希望 A 读取 B 插入的 child 行。

据我了解,REPEATABLE_READ 在这里没有给我任何保证,因为我还没有阅读此事务中的child 表。据我了解,出于同样的原因,这也不被视为幻读。

  • SERIALIZABLE 是否保证 A 不会读取新的 child 行?
  • 我是否需要借助 A 中的应用程序逻辑来丢弃具有对 parent 的无效引用的 child 行?

【问题讨论】:

  • 如果 A 在可重复读取中运行,它将看不到事务开始后插入的任何新(或更改或删除)行。

标签: postgresql isolation-level transaction-isolation


【解决方案1】:

开始事务A
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;

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

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

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多