Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中混合隔离级别_Postgresql_Transactions_Isolation Level - Fatal编程技术网

PostgreSQL中混合隔离级别

PostgreSQL中混合隔离级别,postgresql,transactions,isolation-level,Postgresql,Transactions,Isolation Level,如果任何其他会话使用自动提交或读取提交的隔离级别,对于可序列化事务是否重要 换句话说,当从多个进程/线程(或其他需要注意的事项)访问数据库时,混合使用隔离级别(&autocommit)是否有任何危险 请注意,我知道“普通”问题,如要求重试的可序列化事务等。我要求的是混合不同隔离级别时可能发生的任何不明显的问题 编辑: 发件人: 一致使用可序列化事务可以简化开发。保证任何一组并发可序列化事务将具有与一次运行一个事务相同的效果,这意味着如果您能够证明一个单独的事务(如所述)在单独运行时会做正确的事情

如果任何其他会话使用自动提交或读取提交的隔离级别,对于可序列化事务是否重要

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

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

编辑:

发件人:

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

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

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

这意味着,一个
SERIALIZABLE
事务仅在针对另一个
SERIALIZABLE
事务运行时,其行为不同。如果它们针对不可序列化的事务运行,则它们应该像可重复读取的事务一样运行。这表明,混合使用这些事务隔离级别是完全安全的。

Postgres wiki说明了这一点

任何在非可序列化事务隔离级别上运行的事务都不会受到SSI的影响。如果您希望通过SSI强制执行业务规则,那么所有事务都应该在可序列化事务隔离级别上运行,并且可能应该将其设置为默认级别


因此,当混合隔离级别时,可序列化保证将不起作用。

不,这应该不是问题(但我没有硬引用)@a_horse_与_No_同名-我怀疑这就是数据库的用途,但我找不到任何具体的引用:-)如果你将其发布到Postgres邮件列表中,你可能会得到更好的答案。大多数主要的开发者都在那里“闲逛”。如果有人能回答,那就是他们。@a_horse_和_no_name好的,我明白了,我会在这里等一会儿,如果没有(确定的)答案出现,我会在那里尝试。我来这里是想找到一个答案,如果一个可序列化事务可能受到其他级别事务引入的异常的影响。由于我发现你的问题范围更广,而且答案没有提供这些信息,我在中问了这个问题。我看不出你的结论与你的报价有什么关系。我在中讨论了这个问题,发现手册中的重要细节是Serializable引用隔离级别和Serializable引用计划之间的区别。理解了这一点,然后得出结论,
Serializable
事务是安全的,正如ANSI标准中明确定义的那样。这听起来很危险,但并不安全。这意味着,如果并发的非序列化事务发生干扰,可序列化事务可能会做出错误的假设。假设您开始一个可序列化的xact a并执行一些“INSERT…WHERE NOT EXISTS”,然后一个不可序列化的xact B插入一个与WHERE子句匹配的行并提交,a仍将提交,现在可能您使用xact a的应用程序工作人员做错了什么。