引用自文档:
Read Committed 是 PostgreSQL 中的默认隔离级别。当事务使用此隔离级别时,SELECT 查询(没有 FOR UPDATE/SHARE 子句)只能看到查询开始之前提交的数据;它永远不会看到未提交的数据或并发事务在查询执行期间提交的更改。实际上,SELECT 查询会在查询开始运行时看到数据库的快照。但是,SELECT 确实会看到在其自己的事务中执行的先前更新的影响,即使它们尚未提交。另请注意,如果其他事务在第一个 SELECT 执行期间提交更改,则两个连续的 SELECT 命令可以看到不同的数据,即使它们在单个事务中也是如此。
那么 PostgreSQL 是否看到其他事务提交的更改?
区别在于查询和事务之间。一个事务可以包含任意数量的查询。为了说明差异,我设置了一个小例子:
然后并发运行两个事务(一一发出命令,中间一行要描绘时间线):
在隔离级别运行这些
READ COMMITTED
,第一个查询返回一行带有“old_value”的行,而第二个查询显示一行带有“new_value”的行。在另一次运行中,我更改了左侧事务隔离级别:(该命令必须是事务中的第一条语句。)现在两个 SELECT 返回相同的行集,而在提交两个事务之后的第三个将显示新行。
确实如此。您以粗体标记的第一句话与“并发事务”有关,即更改数据但在您的事务仍在进行时未提交的事务。如果这些并发事务在您之前提交,那么您会在连续选择的事务中看到它们的数据。