你要看一下关注点在哪里,一级封锁协议的关注点是事务修改的数据,二级和三级是事务读取的数据 所有的数据库都支持一级、二级封锁协议,至于三级封锁协议就不一定了,大名鼎鼎的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就是当初设计时认为用到三级封锁协议的情况不多,所以在数据库级别不支持三级封锁协议,让查询效率最大化。然后用回退段来间接支持三级封锁协议的情况
所有的数据库都支持一级、二级封锁协议,至于三级封锁协议就不一定了,大名鼎鼎的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就是当初设计时认为用到三级封锁协议的情况不多,所以在数据库级别不支持三级封锁协议,让查询效率最大化。然后用回退段来间接支持三级封锁协议的情况