postgresql事务级别可重复读取和可序列化是否相同?
Are postgresql transaction levels repeatable read and serializable the same?
引自http://www.postgresql.org/docs/9.4/static/transaction-iso.html:
When you select the level Read Uncommitted you really get Read Committed, and phantom reads are not possible in the PostgreSQL implementation of Repeatable Read, so the actual isolation level might be stricter than what you select.
澄清一下:这是否意味着 pg 的可重复读取 = 可序列化?
没有
可重复读取为 snapshot isolation。这意味着您的事务看到了数据库的单个一致 "snapshot"。它不是完全可串行化的,因为某些操作可能会产生与任何串行排序不一致的结果。例如,如果一个事务插入一行与另一个事务的 SELECT 操作匹配,并且 反之亦然 ,这可能会导致序列化异常。 Serializable 使用一种称为 "predicate locking" 的技术来检测这些情况并拒绝任何违规交易。这个"locking"不阻塞事务,不能参与死锁。
中描述了差异
In fact, this isolation level works exactly the same as Repeatable Read except that it monitors for conditions which could make execution of a concurrent set of serializable transactions behave in a manner inconsistent with all possible serial (one at a time) executions of those transactions.
文档继续给出了一个示例,其中可重复读取和可序列化的行为不同。可序列化事务可以使用 "serialization failure" 中止,但不会阻止任何额外的事务完成。
您引用的部分解释了一些异常情况,因为标准 SQL 隔离级别是围绕锁定数据设计的,但 PostgreSQL 是使用 "MVCC" 设计实现的,其中并发事务可以给数据的独立快照。因此,其他系统中存在的一些区别不适用,Postgres 将隔离级别解释为 "at least as strict as..."
正如 Mark Hildreth 在评论中指出的那样,这种区别仅在 PostgreSQL 9.1 之后才成立。 documentation for 9.0 状态:
But internally, there are only two distinct isolation levels, which correspond to the levels Read Committed and Serializable.
而在较新的版本中,这已被修改为:
But internally, there are only three distinct isolation levels, which correspond to the levels Read Committed, Repeatable Read, and Serializable.
引自http://www.postgresql.org/docs/9.4/static/transaction-iso.html:
When you select the level Read Uncommitted you really get Read Committed, and phantom reads are not possible in the PostgreSQL implementation of Repeatable Read, so the actual isolation level might be stricter than what you select.
澄清一下:这是否意味着 pg 的可重复读取 = 可序列化?
没有
可重复读取为 snapshot isolation。这意味着您的事务看到了数据库的单个一致 "snapshot"。它不是完全可串行化的,因为某些操作可能会产生与任何串行排序不一致的结果。例如,如果一个事务插入一行与另一个事务的 SELECT 操作匹配,并且 反之亦然 ,这可能会导致序列化异常。 Serializable 使用一种称为 "predicate locking" 的技术来检测这些情况并拒绝任何违规交易。这个"locking"不阻塞事务,不能参与死锁。
In fact, this isolation level works exactly the same as Repeatable Read except that it monitors for conditions which could make execution of a concurrent set of serializable transactions behave in a manner inconsistent with all possible serial (one at a time) executions of those transactions.
文档继续给出了一个示例,其中可重复读取和可序列化的行为不同。可序列化事务可以使用 "serialization failure" 中止,但不会阻止任何额外的事务完成。
您引用的部分解释了一些异常情况,因为标准 SQL 隔离级别是围绕锁定数据设计的,但 PostgreSQL 是使用 "MVCC" 设计实现的,其中并发事务可以给数据的独立快照。因此,其他系统中存在的一些区别不适用,Postgres 将隔离级别解释为 "at least as strict as..."
正如 Mark Hildreth 在评论中指出的那样,这种区别仅在 PostgreSQL 9.1 之后才成立。 documentation for 9.0 状态:
But internally, there are only two distinct isolation levels, which correspond to the levels Read Committed and Serializable.
而在较新的版本中,这已被修改为:
But internally, there are only three distinct isolation levels, which correspond to the levels Read Committed, Repeatable Read, and Serializable.