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. 这是因为一个可串行化的事务在可串行化事务开始之后不能更改或者锁住被其他事务更改过的行。因此,当应用收到这样的错误信息时,它应该退出当前的事务然后从头开始重新进行整个事务。在应用程序中,也应该有必要的代码来专门处理该类错误。


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



相关阅读:
Win10 Mobile/PC稳定预览版10586.494更新修复内容汇总
php第一次无法获取cookie问题处理
ORACLE数据库中怎么求除数字、字母之外的非中文字符的正则表达式
js实现接收表单的值并将值拼在表单action后面的方法
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
C#对list列表进行随机排序的方法
安装ImageMagick出现error while loading shared libraries的解决方法
win10/win8.1/win7系统遇到中英文输入法无法切换怎么办?
jquery实现叠层3D文字特效代码分享
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
PHP文件上传类实例详解
使用Java把文本内容转换成网页的实现方法分享
c#通过进程调用cmd判断登录用户权限代码分享
深入本机影像生成器(Ngen.exe)工具使用方法详解
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 人生难求,是懂得 新桃花源记】 整“四风”要一整到底 2015生活中的小数教学反思 车间安全员工作总结范文 丢失作文500字 农电站站长先进事迹材料 青少年要自立作文800字 幻想、 读《智慧教师的50个创意》有感 那一次,我最紧张 2006年《地方志工作条例》宣传电视专题讲话 小学六年级作文600字:发生在教师节的一件事 初中毕业同学录留言 三篇 了解朋友之间交往的原则 论文化因素对英文翻译的影响 梦幻潘多拉 度尚烧财鼓士气 只有奋斗才有路作文700字 励志手机短信 供电所、变电站运行分析制度 2015年銅陵市政府工作報告全文 那段无忧无虑的日子作文600字 2016优秀自我介绍(一分钟) 伊人如画与月述衷肠 「小张先生」   我爱你,没有什么目的。只是爱你。 大学生入党培训思想汇报 机关干部读书交流会发言材料 来悉尼的第一篇日志,慎进,内含咆哮体^_^ 生如夏花——读《骆驼祥子》有感作文 发展非公有制经济的有益探索 我是春天的小草作文 马克思主义概论读后感 他再好但不愿陪你走下去,就是个过客 初二零分作文800字 寻找这种味道 八月初一驾幸延喜楼看冠带降戎 学校送我们的三个礼物 欢乐的十、一作文500字 爱的传送(爱,需要宽容,但不是纵容) 二年级数学上学期教学计划 花吟 留一点孤独给自己作文 高考过后请给自己一个微笑 用耐心成就明天-学生演讲稿 关于平安夜的短信 乡镇机关全套管理制度 面条论 高中高三作文1000字:可爱的兔子 小茉莉 那些年我们听错的歌词,超好笑! 我和书的故事450字

Copyright © 2016 phpStudy |