9.3. 读已提交隔离级别

读已提交(Read Committed)Postgres 里的缺省隔离级别。 当一个事务运行在这个隔离级别时, 一个 SELECT 查询只能看到查询开始之前提交的数据而永远 无法看到未提交的数据或者是在查询执行时其他并行的事务提交做的改变。 (不过 SELECT 的确看得见同一次事务中前面更新 的结果.即使它们还没提交也看得到.) 请注意两个相邻的 SELECT 可能看到不同 的数据,哪怕它们是在同一个事务里,因为其它事务会在第一个 SELECT执行的时候提交.

如果一个正在执行一个 UPDATE 语句(或者 DELETE 或者 SELECT FOR UPDATE ) 的查询返回的行正在被另一个并行的未提交的事务更 新,那么第二个试图更新此行的事务将等待另一个事务的提交或者回卷。 如果发生了回卷,等待中的事务可以继续修改此行。如果发生了提交(并 且此行仍然存在;也就是说,没有被另一个事务删除), 这个查询将对该行再执行一便以检查新行版本是否满足查询搜索条件。 如果新行版本满足 查询搜索条件,那么该行将被更新(或删除或被标记为更新)。 请注意更新的起点将是新行版本;更详细些说,就是在更新之后, 有问题的更新行将可以被同一事务中随后的 SELECT 看到. 因此,当前事务可以看到其它事务对该行的效果.

读已提交提供的部分事务隔离对许多应用而言是足够的,并且这个隔离级别 简单且快速.不过,对于那些做复杂查询和更新的应用, 可能需要保证比读已提交隔离更严格的数据库的一致性.