Quốc Khánh Bùi Asked: 2023-08-20 22:35:07 +0800 CST2023-08-20 22:35:07 +0800 CST 2023-08-20 22:35:07 +0800 CST MVCC 如何在 Postgres 中的已提交读隔离级别下工作 772 假设我有两个事务 A 和 B。事务 A 首先开始。然后事务 B 启动,插入一些数据并提交。因此,从事务A(尚未提交)中,我可以看到事务B提交了数据。由于事务A在事务B之前启动,因此它的XID将小于事务B的XID。根据我的理解,事务A只能看到行由 XID 小于事务 A 的事务修改或插入。 在上面的例子中(读已提交隔离级别),当前事务的XID是741,为什么它可以看到XID是742的事务提交的数据? 抱歉,我认为我的例子不够清楚。我同时启动了两个事务A和B,我让事务B更新并插入一些数据,事务A在事务B提交后可以看到这些数据。所以,我想知道 MVCC 规则如何在已提交读隔离级别下工作。 postgresql 1 个回答 Voted Best Answer jjanes 2023-08-21T22:19:45+08:002023-08-21T22:19:45+08:00 为什么它可以看到数据是由XID为742的事务提交的 因为这就是 READ COMMITTED 的含义。除了具有 txid 的事务(如果曾经需要)之外,每个语句都有一个快照。在 READ COMMITTED 事务中,快照会随着语句的不同而发生变化(至少在存在并发活动的情况下会发生变化),而对于 REPEATABLE READ 来说,快照始终是相同的。
因为这就是 READ COMMITTED 的含义。除了具有 txid 的事务(如果曾经需要)之外,每个语句都有一个快照。在 READ COMMITTED 事务中,快照会随着语句的不同而发生变化(至少在存在并发活动的情况下会发生变化),而对于 REPEATABLE READ 来说,快照始终是相同的。