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 交通频道 作文范文 大庆西-珲春 秦皇岛-溆浦 贵定北-南昌西 孔家沟-田家沟 咸宁北-信阳东 哈密-芜湖 定西-民权 岔江-宜良北 邹城-广安 信阳东-永福南 沈阳北-义乌 通化县-通化 锦州-义乌 帽儿山-朝阳村 霸州-安庆西 杨柳青-南岔 金州-到保 兴安北-邢台东 耒阳-涡阳 呼兰-开道 蕲春-葫芦岛 宜宾-临江溪 信阳-任丘 白城-晏城 康庄-天镇 扶余-横峰 城固-白河县 金昌-同心 邢台-蓬安 龙山镇-厦门北 伊图里河-姜家 济南东-昌图 富裕-下马塘 民权-汨罗 南平南-横峰 车转湾-雨格 武昌-平凉 福利屯-向阳川 滁州-金山北 沈阳北-查布嘎 柳河-公主岭 西乡-长沙 秦皇岛-太平川 淄博-上饶 山海关-凤城东 丹凤-资溪 云霄-涵江 南通-潢川 唐山北-大同 大庆-阿城 抚州-信阳 惠东-乐清 海石湾-安阳 商丘南-绥化 广元-兰州西 泰来-大乌苏 丹东-镇赉 安庆西-德安 沙园-西岗子 龙镇-沙园 大石头-黄泥河 哈尔滨西-横道河子 苏州-石柱县 山海关-武义 漯河西-武汉 西峡-乌鲁木齐 铜陵-贵阳 绥化-富锦 溆浦-义乌 章党-清原 低庄-安化 秦皇岛-汉口 中卫-焉耆 同心-黄羊湾 新会-广州南 子洲-沁县 葫芦岛-辽源 园墩-中卫 瓢儿屯-李石寨 鲘门-绍兴东 有没有上午的列车从余姚到德清的
从营口去天沐温泉怎么走
济南3路车在列车火车站的哪个位置有站牌从列车火车站到洪楼有BRT吗
汽车客车西站坐什么车到衡阳市亚明纸业公司
从青岛至邢台怎么坐车
从辽阳到大连坐火车还是汽车快,我想赶中午12点去烟台船
湖南耒阳到北京骑单车要多久
我从上海到河北的任丘。 请问怎么坐车最快。 最好是列车吧``
请问下从上海青浦区白鹤镇到堡镇怎么走啊?
想买21号从北京到大连的列车火车票,现在北京铁路局提前多少天售
从周家嘴路海门路到上海图书馆坐什么车
在回龙观坐几号线火车列车到朝阳区潘家园桥东
我要从临沂沂南坐火车到烟台,可这边是03:20发车,这个
离常德火车站最近的有什么酒店
咸阳市武功县普集镇自考2011年四月报名时间
丹东到青岛的火车列车路过沈阳的哪个站啊
买10月26日自哈尔滨到海口的飞机票,需要票价多少钱
南京到上海的交通方式及价格
从广州番禺市桥坐车到惠州市陈江大概需要多少小时?
请问衢州学院到南站怎么坐公交车?
厦门到深圳邮资要多少
多出一张10月7号孝感到广州的K9次火车座票一张
我想知道从河北邯郸到四川卢州怎么走,火车,汽车都行,大概需要
有没有南昌到深圳的特快列车几点
上海列车火车站到虹桥列车火车站地铁如何坐
上海到无锡有什么汽车
北京到新沂怎么省钱 1
我要2011年4月20号从苏州去厦门,求怎么走性价比高,回答要
想要知道江西各大著名风景区 大门票的价钱! 离南昌多少公里?
安塞腰鼓中容不得束缚到那么一股劲写出安塞人怎样的性格

Copyright © 2016 phpStudy |