数据库的隔离级别及其封锁协议.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文档。上传文档
查看更多
数据库的隔离级别及其封锁协议 为了说有关数据库的隔离级别,先解释下一些概念。 首先要知道的是设置数据库的隔离级别是为了进行并发控制。 下面是由于对数据库的并发访问所造成的5类问题: 1. 第一类丢失修改(Lost Update)【回滚丢失】:当2个事务更新相同的数据源,如果第一个事务被提交,而另外一个事务却被撤销, ????那么会连同第一个事务所做的跟新也被撤销。也就是说第一个事务做的更新丢失了。 ???这种问题在数据库中基本不会出现 2.脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。 ? 3.不可重复读(non-repeatable read):是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。 ? 4.第二类丢失修改(Second lost updates problem): 无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。 ? 5.幻像读(phantom read):: 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。 ? 对于3与5的区别: 不可重复读的重点是修改 : 同样的条件 ,?? 你读取过的数据 ,?? 再次读取出来发现值不一样了 幻读的重点在于新增或者删除 同样的条件 ,?? 第 1 次和第 2 次读出来的记录数不一样 下面是数据库的四个隔离级别(在数据库的四种隔离级别中都可以解决的一个问题就是第一类丢失更新) ? 1.Serializable:可以解决以上5个问题,使以上五个问题都不会出现。 2.Repeatable Read(可重复读): 在一个事务内进行多次数据查询时,保证多次查询的结果是一致的. ?读事务会阻塞写事务,但是读事务不会阻塞读事务,但是写事务会阻塞写事务和读事务。因为读事务阻塞了写事务,样以来就不会造成不可重复读的问题。 3.Read Commited(提交读):在一个事务中,发出的SQL语句对数据进行了操作并提交后,其它事务才可以查询到操作后的数据。 在脏读这个问题中,A事务不可以读取到B事务未提交的更改,所以可以解决脏读的问题。对于虚读/不可重复读/第二类丢失更新的问题,由于B事务的操作已提交,所以A事务依然可以查询到B事务所操作的数据,因此虚读/不可重复读/第二类丢失更新的问题不能解决。 写事务就会阻塞读事务和写事务,但是读事务不会阻塞读事务和写事务,这样因为写事务会阻塞读取事务,那么从而读取事务就不能读到脏数据,但是因为读事务不会阻塞其它的事务,这样还是会造成不可重复读的问题。 4.Read Uncommited(未提交读):在一个事务中,只要发出了SQL语句对数据进行了操作而未提交,其它事务均可马上查询到操作后的数据,所以这种隔离级别并不能解决其它四个问题。 读事务不会阻塞读事务和写事务,写事务也不会阻塞读事务,但是会阻塞写事务。这样造成的一个结果就是当一个写事务没有提交的时候,读事务照样可以读取,那么造成了脏读的现象。 ? ? 数据库的默认隔离级别: 大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle. 少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎?? ? 几种锁: ?排他锁:X锁? 其他事务在T释放A上的锁之前不能在读取和修改A? ?共享锁:S锁?? 其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改 ?修改锁(Update Lock):将要修改的数据加Update锁(并非所有DBMS都有) ? 封锁协议: 一级封锁协议 在事务修改数据的时候加x锁,直到事务结束(提交或者回滚)释放x锁。 事务T读数据不加锁 一级封锁协议可以有效的防止丢失更新,但是不能防止脏读不可重复读的出现。 ? ? ? ? ? ? 二级封锁协议: 在一级封锁的基础上事务读数据的时候加s锁,读取之后释放。二级封锁协议可以防止丢失更新,脏读。不能防止不可重复读。 三级封锁协议: 在一级封锁的基础上事务读数据的时候加s锁,直到事务结束释放。二级封锁协议可以防止丢失更新,脏读,不可重复读。 两阶段封锁协议,可串行性封锁协议: ?1)

文档评论(0)

中华书局 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档