PostgreSQL 中的混合隔离级别

Tom*_*ski 7 postgresql transactions isolation-level

如果任何其他会话使用例如自动提交或 READ COMMITED 隔离级别,这对 SERIALIZABLE 事务是否重要?

换句话说,从多个进程/线程(或其他需要注意的地方)访问数据库时,混合隔离级别(和自动提交)是否有任何危险?

请注意,我知道“普通”问题,例如要求重试的 SERIALIZABLE 事务等。我要求在混合不同隔离级别时可能发生的任何不明显的事情。

编辑:

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

一致使用可序列化事务可以简化开发。保证任何一组并发可序列化事务将具有与一次运行一个相同的效果意味着如果您能证明单个事务,如所写的那样,在单独运行时会做正确的事情,您可以有相信它会在任何可序列化事务的组合中做正确的事情,即使没有关于其他事务可能会做什么的任何信息。

这可能表明混合隔离级别不是一个好主意。另一方面,它只是说一致使用 SERIALIZABLE 级别是好的,而不是混合隔离级别是坏的。

poz*_*ozs 0

SERIALIZABLE

当前事务的所有语句只能看到在该事务中执行第一个查询或数据修改语句之前提交的行。如果并发可序列化事务之间的读写模式会造成这些事务的任何串行(一次一个)执行不会发生的情况,则其中一个事务将被回滚并出现serialization_failure错误。

这意味着,一个SERIALIZABLE事务仅在针对另一个SERIALIZABLE事务运行时才会有不同的行为。如果它们针对非SERIALIZABLE交易运行,则它们应该像交易一样行事REPEATABLE READ。这表明,混合这些事务隔离级别是完全安全的。

  • 这听起来很危险,但并不安全。这意味着如果并发的不可序列化事务干扰,您的可序列化事务可能会做出错误的假设。假设您开始一个可序列化的 xact A 并执行一些“INSERT...WHERE NOT EXISTS”,然后不可序列化的 xact B 插入与 WHERE 子句匹配的行并提交,A 仍会提交,现在也许您的应用程序工作人员使用 xact A做错事了。 (3认同)
  • 我看不出你的结论与你的引文有何关系。我在[DBA](http://dba.stackexchange.com/questions/148598)中讨论了这个问题,发现手册中的重要细节是**S**erialized指的是隔离级别和**之间的区别参考时间表可串行化。了解这一点,就可以得出这样的结论:“可序列化”事务是安全的,正如 ANSI 标准中明确定义的那样。 (2认同)