事务隔离级别与锁.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
今天答辩囧态百出。然后认真的把资料分析和整理了下,思路缕清楚了,也把几个问题制造出来,下次不能再这样了,啊HOU... ? 脏读 出现问题的情况 先运行事务Ⅰ在运行事务Ⅱ,直到十秒结束后在运行事务Ⅱ,出现脏读--事务Ⅰ begin tran update lock set A2 = 20 where A1 = 10 waitfor delay 00:00:10 rollback tran --事务Ⅱ SET TRANSACTION ISOLATION LEVEL READ unCommitted select * from lock where A1 = 10 现象: 原数据库数据 运行事务Ⅰ后是秒内再运行事务Ⅱ,结果 十秒后在运行事务Ⅱ 用提交读隔离级别解决 --事务Ⅰ SET TRANSACTION ISOLATION LEVEL READ Committed begin tran select * from lock WHERE A1=10 commit tran --事务Ⅱ SET TRANSACTION ISOLATION LEVEL READ Committed select * from lock where A1 = 10 现象: 原数据库数据 运行事务Ⅰ后10秒内再运行事务Ⅱ,结果 事务Ⅱ进入等待 直到10秒后出现结果 分析: 1. 隔离级别为提交读的事务在每次查询时都会申请获取共享锁,而未提交读 则不会申请,而是直接执行语句 2. 在提交读隔离级别下,事务读取数据时,对数据加上共享锁,查询结束后 立刻释放共享锁(共享锁的锁定时间与事务的隔离级别有关,见注1),在其他一个或者多个事务对某数据拥有共享锁期间,无法获得排它锁,即无法对数据进行修改。 3. 当其他事务对数据不拥有共享锁时事务对数据进行更新操作,将获得排它 锁,直到事务提交才将锁释放。 4. 若某一个事务获得排他锁时,则其他事务是不能获得共享锁的(即排他锁 与共享锁不能兼容) 所以提交读就保证了不会出现脏读的情况 ? 不可重复读 出现问题的情况 T1运行到一半,T2运行完成之后T1才将事务提交 --事务T1 begin tran select * from lock where A1=10 waitfor delay 00:00:10 select * from lock where A1=10 commit tran --事务T2 begin tran update lock set A2 = 70 where A1 = 10 commit tran 结果为 使用可重复读(repeatable read)则可以解决这个问题 --事务T1 SET TRANSACTION ISOLATION LEVEL repeatable read begin tran select * from lock where A1=10 waitfor delay 00:00:10 select * from lock where A1=10 commit tran --事务T2 begin tran update lock set A2 = 70 where A1 = 10 commit tran 可重复读的上锁情况是 事务在查询时候获取共享锁,直到事务提交才将锁释放,在此期间其他事务无法获得排他锁,所以无法进行更新操作,进入等待,知道其他事务将共享锁释放。这样避免了问题 ? 幻读 运行T3后运行在2--10秒内运行事务T4 --事务T3 begin tran select * from lock waitfor delay 00:00:10 select * from lock commit tran --事务T4 begin tran Insert into lock values(99,99) commit tran 可串行读(serializable) 仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。 总结:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。 注1: 共享锁的锁定时间与事务的隔离级别有关,如果隔离级别为Read Committed的默认级别, 只在读取(select)的期间保持锁定,即在查询出数据以后就释放了锁;如果隔离级别为 更高的Repea

文档评论(0)

339910001 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档