在PostgreSQL中混合隔离级别

时间:2014-05-22 11:08:16

标签: postgresql transactions isolation-level

如果任何其他会话使用例如SERIALIZABLE交易,这是否重要autocommit或READ COMMITED隔离级别?

换句话说,当从多个进程/线程(或其他任何需要注意的事项)访问数据库时,混合隔离级别(& autocommit)是否有任何危险?

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

编辑:

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

  

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

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

2 个答案:

答案 0 :(得分:0)

  

SERIALIZABLE

     

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

这意味着,SERIALIZABLE事务在针对另一个SERIALIZABLE事务运行时仅采取不同的行为。如果他们针对非SERIALIZABLE次交易进行竞争,则他们应该按照REPEATABLE READ次交易行事。这表明,混合这些事务隔离级别是完全安全的。

答案 1 :(得分:0)

Postgres Wiki https://wiki.postgresql.org/wiki/Serializable#PostgreSQL_Implementation对此进行了说明

  

以SERIALIZABLE以外的事务隔离级别运行的任何事务都不会受到SSI的影响。如果要通过SSI强制执行业务规则,则所有事务都应在SERIALIZABLE事务隔离级别上运行,并且应该将其设置为默认值。

因此,在混合隔离级别时,SERIALIZABLE保证将不成立。