在SQL标准中,事物的分离级别分为四种
类型:
1。读取未提交的(未提交读)
2。已提交阅读(读取提交)
三.可重复读(可重复读)
4。序列化(序列化)
然而,在9.1版本之前,PostgreSQL只实现其中的两个,即读已提交和序列化。如果其他两个是在实际应用中选择,PostgreSQL将自动
调整到一个更严格的隔离级别。在PostgreSQL v9.1版本三的实现提供,即重复添加数据在原有的基础上,在这个博客,我们将解释只有2和4之间的比较),因为9.1的差异,3和4是非常小的。
已提交读
序列化
PostgreSQL的
默认隔离级别
对
不
其他事物是否不提交数据是可见的。
看不见的
看不见的
执行效率
高的
低的
适用场景
简单的SQL逻辑,如果嵌套
查询包含在SQL语句中,那么在多个SQL查询中获取不同版本的数据是非常可能的。
复杂的SQL逻辑,特别是嵌套查询,更适用。
选择查询一致性时间点
从SELECT查询的执行开始,查询执行阶段,根据查询结果集数据
操作的任何其他并发事务都不会是查询读取,查询数据版本是一致的执行开始于查询数据版本。
根据查询开始的选择查询,在执行查询时,根据查询结果集数据操作的任何其他并发事务都不会是查询读取,查询数据版本与开始查询数据版本的
位置一致。
同事对象中的数据操作是否可见
例如,在同一个事件中,
内存中有更新和选择操作。即使当前的东西还没有提交,更新所做的
修改仍然可见于选择当前的东西后面。
它和读的一样。
同事对象中相同选择的数据是否相同
对选择的一致性,不同的时间点是在查询执行的开始时间,和多个查询点肯定是不一样的,如果在第一个查询到第二查询开始修订并提交与其他事物之间或事物只修改查询得到的数据,然后将数据操作的结果将反映在第二查询。
有两个
步骤要采取。对于同一件事在一个修改,如果它发生在两个查询,第二查询会看到这些变化的结果。然而,会有其他并发的东西,修改,没有
影响,这两种选择的结果是相同的。
原因很明显,选择的时间点的一致性该隔离级别是一致的与事物的开始。
对同一行数据的修改
如果在修改同一行的两个
并行的东西,修改首先要银行级别的锁,另一件将进入
等待状态,直到第一个电话那端的操作。如果第一次手术改良线最终被回滚,第二修改操作将修改数据直接的等待结束后。但是,如果第一个操作正常提交,那么我们需要进一步确定操作的类型。如果
删除(删除)行,则第二个修改操作将被忽略。如果它是更新行的记录,则第二次修改操作需要重新评估该行是否仍然与先前定义的修改
条件一致。
读已提交机制隔离水平基本相同,只在第一次手术后提交的修改操作将不再区分在修改删除或更新,而是直接返回以下信息:
错误:无法序列化由于并发更新访问。因为序列化的交易无法
启动被改变或被另一个事务更改锁定后,它是一个可序列化事务。因此,当
应用程序接收到这样的错误信息,它应该
退出当前事务并
重新启动整个交易从一开始,在一个应用程序,你也应该有
处理这种类型的错误的必要的代码。
最后,需要说明的是,在绝大多数
情况下,读取提交等级可以应用,和并行效率水平较高。只有在比较特殊的情况,目前的隔离级别手动调整序列化或重复。