postgresql事务级别可重复读取和序列化是否相同?

时间:2015-06-05 14:23:34

标签: postgresql transaction-isolation

引自http://www.postgresql.org/docs/9.4/static/transaction-iso.html

  

当您选择级别Read Uncommitted时,您实际上已获得Read Committed,并且在可重复读取的PostgreSQL实现中无法进行幻像读取,因此实际的隔离级别可能比您选择的级别更严格。

澄清:这是否意味着pg的可重复读取=可序列化?

2 个答案:

答案 0 :(得分:6)

没有;差异在the page you linked to上描述:

  

实际上,这个隔离级别与Repeatable Read完全相同,不同之处在于它监视可能导致并发可序列化事务集的执行行为的方式与所有可能的串行(一次一个)执行的行为不同。那些交易。

文档继续给出一个示例,其中Repeatable Read和Serializable的行为不同。 Serializable事务可以在#34;序列化失败的情况下中止,但不会阻止任何额外的事务完成。

你引用的部分解释了一些异常,因为标准的SQL隔离级别是围绕锁定数据设计的,但是PostgreSQL是用" MVCC"来实现的。设计,可以为并发事务提供数据的独立快照。因此,其他系统中存在的一些区别并不适用,而Postgres将隔离级别解释为“至少与......一样严格”。

正如Mark Hildreth在评论中指出的那样,这种区别仅适用于PostgreSQL 9.1。 documentation for 9.0州:

  

但在内部,只有两个不同的隔离级别,对应于Read Committed和Serializable等级。

在较新的版本中,这已被修改为:

  

但在内部,只有三个不同的隔离级别,对应于Read Committed,Repeatable Read和Serializable等级。

答案 1 :(得分:3)

没有

可重复读取是snapshot isolation。这意味着您的交易会看到一个一致的"快照"的数据库。它不是完全可串行化的,因为某些操作可能会产生与任何序列排序不一致的结果。例如,如果一个事务插入与另一个事务的SELECT操作匹配的行,而反之亦然,则可能导致序列化异常。 Serializable使用一种名为"谓词锁定的技术"检测这些情况并拒绝任何违规交易。这"锁定"不阻止交易,也不能参与僵局。