选择使用Read Committed,请澄清

时间:2014-05-03 06:50:23

标签: postgresql isolation-level isolation

http://www.postgresql.org/docs/9.1/static/transaction-iso.html 关于Read Committed Isolation Level的文档说

  

Read Committed是PostgreSQL中的默认隔离级别。当事务使用此隔离级别时,SELECT查询(没有FOR UPDATE / SHARE子句)仅查看在查询开始之前提交的数据;它永远不会看到未提交的数据或在并发事务的查询执行期间提交的更改。实际上,SELECT查询会在查询开始运行的瞬间看到数据库的快照。但是,SELECT确实看到了在其自己的事务中执行的先前更新的效果,即使它们尚未提交。另请注意,如果其他事务在执行第一个SELECT期间提交更改,则两个连续的SELECT命令可以看到不同的数据,即使它们位于单个事务中。

最后一句让我困惑,这是什么意思?如果我在事务中没有2个选择但是3并且在它们之间没有使用DML的情况下进行一些计算会怎么样?每个选择都会在每个查询开始时看到它自己的快照吗?

1 个答案:

答案 0 :(得分:4)

最后一句是指这种情况。

假设在两个事务开始之前有一个表foo包含一行:

Transaction 1            Transaction 2
-------------------------------------------------------
begin transaction;
select *
from foo;
--> returns 1 rows
                         begin transaction;
                         insert into foo values (2);
                         commit;
select * 
from foo;
--> now returns 2 rows

(请注意,第一次选择后尚未提交事务1)

如果您不想在事务1中看到新的(已提交的)行,则需要使用名为"可重复读取"的隔离级别。该名称源于您可以反复重复相同的查询,您将重复看到相同的数据。

相关问题