PostgreSQL教程(九):事物隔离介绍_PostgreSQL

在SQL的标准中事物隔离级别分为以下四种:
    1. 读未提交(Read uncommitted)
    2. 读已提交(Read committed)
    3. 可重复读(Repeatable read)
    4. 可串行化(Serializable)
    然而PostgreSQL在9.1之前的版本中只是实现了其中两种,即读已提交和可串行化,如果在实际应用中选择了另外两种,那么PostgreSQL将会自动向更严格的隔离级别调整。在PostgreSQL v9.1的版本中提供了三种实现方式,即在原有的基础上增加了可重复读。在这篇博客中我们将只是针对2)和4)进行说明和比较,因为在9.1中,3)和4)的差别也是非常小的。

 

  读已提交 可串行化
PostgreSQL缺省隔离级别
其它事物未提交数据是否可见 不可见 不可见
执行效率
适用场景 简单SQL逻辑,如果SQL语句中含有嵌套查询,那么在多次SQL查询中将极有可能获得不同版本的数据。 复杂SQL逻辑,特别是带有嵌套的查询比较适用。
SELECT查询一致性时间点 从该SELECT查询开始执行时,在此查询执行期间,任何其它并发事物针对该查询结果集的数据操作都将不会被本次查询读到,即本次查询获取的数据版本是与查询开始执行时的数据版本相一致。 从该SELECT查询所在事物开始时,在此查询执行期间,任何其它并发事物针对该查询结果集的数据操作都将不会被本次查询读到,即本次查询获取的数据版本是与查询所在事物开始时的数据版本相一致。
同事物内的数据操作是否可见 比如在同一个事物内存在update和select操作,即使当前事物尚未提交,update所作的修改,在当前事物后面的select中依然可见。 和读已提交相同。
同事物内多次相同的select所见的数据是否相同 不同,由于该级别select的一致性时间点是该查询开始执行时,而多次查询的时间点将肯定不相同,如果在第一次查询开始到第二次查询开始之间,其它的并发事物修改并提交或当前事物仅修改了查询将要获取的数据,那么这些数据操作的结果将会在第二个查询中有所体现。 需要分两步来说,对于同一事物内的修改如果发生在两次查询语句之间,那么第二个查询将会看到这些修改的结果。然而对于其它并发事物的修改,将不会造成任何影响,即两次select的结果是相同的。原因显而易见,该隔离级别的select一致性时间点是与事物开始时相一致的。
相同行数据的修改 如果此时两个并发事物在修改同一行数据,先修改的事物将会给该行加行级锁,另外一个事物将进入等待状态,直到第一个事物操作该行结束。那么倘若第一个针对该行的修改操作最终被其事物回滚,第二个修改操作在结束等待后,将直接修改该数据。然而如果第一个操作是被正常提交的话,那么就需要进一步判断该操作的类型,如果是删除(delete)该行,第二个修改操作将直接被忽略。如果是update该行的记录,第二个修改操作则需要重新评估该行是否依然符合之前定义的修改条件。 和读已提交隔离级别的机制基本相同,只是在第一个修改操作提交后,第二个操作将不再区分之前的修改是delete还是update,而是直接并返回下面信息:Error: Can't serialize access due to concurrent update. 这是因为一个可串行化的事务在可串行化事务开始之后不能更改或者锁住被其他事务更改过的行。因此,当应用收到这样的错误信息时,它应该退出当前的事务然后从头开始重新进行整个事务。在应用程序中,也应该有必要的代码来专门处理该类错误。

    最后需要说明的是,在绝大多数的情况下,读已提交级别均可适用,而且该级别的并发效率更高。只有在比较特殊的情况下,才手工将当前的事物隔离级别调整为可串行化或可重复读。

时间: 2024-09-20 07:40:03

PostgreSQL教程(九):事物隔离介绍_PostgreSQL的相关文章

PostgreSQL 角色与用户管理介绍_PostgreSQL

一.角色与用户的区别 角色就相当于岗位:角色可以是经理,助理.用户就是具体的人:比如陈XX经理,朱XX助理,王XX助理.在PostgreSQL 里没有区分用户和角色的概念,"CREATE USER" 为 "CREATE ROLE" 的别名,这两个命令几乎是完全相同的,唯一的区别是"CREATE USER" 命令创建的用户默认带有LOGIN属性,而"CREATE ROLE" 命令创建的用户默认不带LOGIN属性(CREATE U

PostgreSQL教程(十四):数据库维护_PostgreSQL

一.恢复磁盘空间:     在PostgreSQL中,使用delete和update语句删除或更新的数据行并没有被实际删除,而只是在旧版本数据行的物理地址上将该行的状态置为已删除或已过期.因此当数据表中的数据变化极为频繁时,那么在一段时间之后该表所占用的空间将会变得很大,然而数据量却可能变化不大.要解决该问题,需要定期对数据变化频繁的数据表执行VACUUM操作.     VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格:   无VACUUM VACUU

PostgreSQL教程(三):高级特性

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 3.1. 简介 在之前的章节里我们已经涉及了使用SQL在PostgreSQL中存储和访问数据的基础知识.现在我们将要讨论SQL中一些更高级的特性,这些特性有助于简化管理和防止数据丢失或损坏.最后,我们还将介绍一些PostgreSQL扩展. 本章有时将引用PostgreSQL教程(二)中的例子并对其进行改变或改进以便于阅读本章.在这里就不在赘述. 3.2. 视图 回想一下Section 2.6中的查询.假设天气记录和城市

MVC5+EF6 入门完整教程九

原文:MVC5+EF6 入门完整教程九 前一阵子临时有事,这篇文章发布间隔比较长,我们先回顾下之前的内容,每篇文章用一句话总结重点. 文章一 MVC核心概念简介,一个基本MVC项目结构 文章二 通过开发一个最基本的登录界面,介绍了如何从Controller中获取表单数据 文章三 EF的整个开发过程 文章四 EF基本的CRUD和常用的HtmlHelper 文章五 使用布局页(模板页)改造UI 文章六 分部视图(Partial View) 文章七 排序过滤分页 文章八 不丢失数据进行数据库结构升级

事物隔离级别和行日志格式设置不当导致故障案例

最近刚接手个新项目的测试平台采用了spring的事务机制,在用户认证登录时总是提示认证超时,于时查看相应的各应用服务器日志,发现报了异常: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'... ...... 前端某台应用服务器报如下错: {"returnNo":0,"listFie

PostgreSQL模板 pg_stat_statements的官方介绍/简单安装步骤

链接:http://blog.itpub.net/28602568/viewspace-2077893/ 标题:PostgreSQL模板 pg_stat_statements的官方介绍/简单安装步骤  作者:lōττéry版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.] PostgreSQL 9.3.1 官方中文手册介绍pg_stat_statements F.28. pg_stat_statements pg_stat_statements模块提供一种跟踪执行统计服务器

mysql 事务 线程-mysql事物隔离的问题,求大神指教

问题描述 mysql事物隔离的问题,求大神指教 我对mysql事物隔离性一向是一知半解,这次还是下决心做了一个测试,不过测试的结果无法解释求大神指教:主函数如下:public static void main(String args[]) { // 初始化数据库 String dev = ""com.mysql.jdbc.Driver""; String url = ""jdbc:mysql://localhost:3306/testdb?rel

Json.Net系列教程 1.Json.Net介绍及实例

原文 Json.Net系列教程 1.Json.Net介绍及实例 本系列教程假设读者已经对Json有一定的了解,关于Json在这里不多说.本系列教程希望能对读者开发涉及到Json的.Net项目有一定的帮 助.本系列教程是根据官方文档资料和自己项目应用汇总而成.如果觉得本系列对你有用,望多多关注.本人还只是个未毕业的学生,水平有限,尽请指正. 一.Json.Net有什么用? Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过L

WPF入门教程系列二——Application介绍

原文:WPF入门教程系列二--Application介绍 一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在.和 WinForm 不同的是WPF Application默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Asp.Net WebForm,将定义和行为代码相分离. 微