本帖最后由 wobuwei 于 2010-07-23 00:15:57 编辑

解决方案 »

  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就是当初设计时认为用到三级封锁协议的情况不多,所以在数据库级别不支持三级封锁协议,让查询效率最大化。然后用回退段来间接支持三级封锁协议的情况