本文共 938 字,大约阅读时间需要 3 分钟。
1)为啥要加S锁?直接读不就得了?
-------->S锁是事务在读取数据时,禁止其他事务对数据进行修改,同时允许其他事务对数据进行读取。考虑到如果其他事务在某事务A读取过程中进行了修改,可能导致事务A看到了它意想不到的结果。
例如:事务A在读取数据时,读到了1000,多次刷新读取,事务B在事务A读取的过程中修改了数据为800,那么事务A在某次刷新之后就看到了数据为800,如果事务B又在A读取过程中回滚了,那么事务A在之后某次刷新后看到了数据又变回了1000。发生了脏读和不可重复读。
2)三级封锁协议中,一级封锁协议为啥要加X锁?而不是S锁?为啥要先考虑保护修改而不是读取呢?
-------->修改的过程包括:首先要读取数据(read),然后再修改(update、insert、delete),提交或者回滚(commit、rollback),而读取则只包括一次查找。即修改是个“大操作”,读取是个“小操作”。从原子性的角度来看,首先要保全“大操作”的原子性,再对“小操作”的原子性进行补充。(个人观点)(貌似不对)
-------->一级协议对如何加X锁进行了约束,即在修改数据之前加X锁,直到事务结束后才释放。
二级协议和三级协议补充了一级协议,对如何加S锁进行了约束:
二级协议中规定:除了一级协议外,事务如果只是想读取数据,必须先对数据加S锁,读取完成后释放S锁。
三级协议比二级协议对S锁释放更加严格:除了一级协议外,事务如果只是想读取数据,必须先对数据加S锁,直到事务结束后释放S锁。
因此有如下图:
(图像来自:华中科技大学mooc)
在一致性保证中,可以发现,丢失修改是由修改导致的问题,而脏读和不可重复读都是由读取导致的问题。
2)、<1>又冒出的一个问题:在第三级协议中,S锁直到事务结束才释放,那么就不会导致幻读情况发生吧??到第三级协议时相当于达到了Serializable的级别??那为啥还要使用多版本控制干啥??
3)二级封锁协议是在一级的基础上,规定,事务读取数据之前必须先对其加S锁,读取完后可释放S锁。为啥?一级加锁中加了X锁可以读取也可以修改,为啥还要考虑加S锁?再说了加了X锁之后就不能再加S锁了,这为啥说是在“一级封锁协议基础上”
转载地址:https://blog.csdn.net/mengmengmengwang/article/details/108266831 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!