二级封锁协议与三级封锁协议的区别

我不为 2010-07-23 12:11:18
x锁: 排他锁 被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象
s锁 共享锁 被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加s锁。

一级封锁协议:
在事务修改数据的时候加x锁,直到事务结束(提交或者回滚)释放x锁。一级封锁协议可以有效的防止丢失更新,但是不能防止脏读不可重复读的出现。

二级封锁协议:
在一级封锁的基础上事务读数据的时候加s锁,读取之后释放。二级封锁协议可以防止丢失更新,脏读。不能防止不可重复读。
三级封锁协议:
在一级封锁的基础上事务读数据的时候加s锁,直到事务结束释放。二级封锁协议可以防止丢失更新,脏读,不可重复读。

问题:二级封锁协议为什么 不能防止不可重复读。
我的理解是:
二级封锁协议 是在一级封锁协议 基础上进行的。因为一级封锁协议 已经加了 X锁。有根据X锁的定义,只要加了X锁,其他事物既不能读取该对象,也不能修改该对象。所以就不存在 重复读,脏读和丢失更新。
所以只要加了X锁就能防止 重复读,脏读和丢失更新。
有一级封锁就够了。
不知道我的理解错在哪里。
...全文
1595 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cactus123456 2010-07-23
  • 打赏
  • 举报
回复
上面说了3种封锁协议的作用点,如果你明白了,就好理解一级、二级和三级封锁协议如何实现防止丢失更新,脏读和不能防止不可重复读,要解释清楚防止丢失更新,脏读和不能防止不可重复读可是需要长篇大论了,不过网上有很多资料,你可以找找看。
cactus123456 2010-07-23
  • 打赏
  • 举报
回复
Orcle少敲了个a因该oracle
cactus123456 2010-07-23
  • 打赏
  • 举报
回复 1
你要看一下关注点在哪里,一级封锁协议的关注点是事务修改的数据,二级和三级是事务读取的数据
所有的数据库都支持一级、二级封锁协议,至于三级封锁协议就不一定了,大名鼎鼎的Orcle好称最快查询
速度是牺牲三级封锁协议来完成的,但是它也支持三级封锁协议,只是用回退段来实现。所以Orcle如果
回退段满了,就不支持三级封锁协议了,会报快照太旧。而DB2就在数据库级别
实现了三级封锁协议。
在一个事务中
BEGIN TRANSACTION;
Update T set A='bb' where Id=1000
-->0
Selelct * form T where Id=1000
-->1
Sleep(1000)
COMMIT;
-->2
一级封锁协议在-->0起作用,直到事务完成释放,如果此时另一进程也要修改T表Id=1000的数据,则需要等待
二级封锁协议在-->1处就释放锁了,如果此时另一进程查询也查询Selelct * form T where Id=1000,则查询立刻返回结果
如果此时数据库加的是三级封锁协议,此时另一进程查询也查询Selelct * form T where Id=1000,则需要等待,直到-->2处才返回结果
三级封锁协议虽然避免了不可重复读,但是会造成查询的效率变低。我个人猜想Oralce就是当初设计时认为用到三级封锁协议的情况不多,所以在数据库级别不支持三级封锁协议,让查询效率最大化。然后用回退段来间接支持三级封锁协议的情况
999朵玫瑰 2010-07-23
  • 打赏
  • 举报
回复
学习了
幸运的意外 2010-07-23
  • 打赏
  • 举报
回复
封锁和封锁协议也是我的软肋,哎,抽空补充一下。
ChinaITOldMan 2010-07-23
  • 打赏
  • 举报
回复
learning,up
s_111111 2010-07-23
  • 打赏
  • 举报
回复
關注。。。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧