- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 监控报价清单表-监控报价模板.xlsx VIP
- (2025秋新版)人教版二年级数学上册全册教案.doc
- 2026年河北水利发展集团有限公司公开招聘工作人员41名笔试模拟试题及答案解析.docx VIP
- 未成年人网络保护条例知识竞赛试题(含答案).docx VIP
- 2025高中信息技术课标.docx
- AS NZS 61000.4.3-2013 国外国际规范.pdf VIP
- _2025年证券专项《证券投资顾问》必背100句.pdf VIP
- 《无机非金属材料》全册完整教学课件.pptx VIP
- _2025年证券专项《证券投资顾问》超高频考点汇总.pdf VIP
- 在线网课学习课堂《医学信息素养(广州医大)》单元测试考核答案.docx VIP
文档评论(0)