|
本帖最后由 digdeep126 于 2014-5-6 15:10 编辑
liushuiwuqing4 发表于 2014-4-30 11:18 ![]()
你的解释也就是我的问题,为什么 6.6在gap之内,而8.6在gap之外呢?
这个问题,我觉得我想清楚了:
where b=3 for update, 为了解决幻读,必须不能插入 b=3的记录,那么如何才能不插入b=3的记录来,使用gap锁,那么应该如何使用gap锁呢?锁住(3,5)到(6,7)之间的gap,以及(1,3)到(3,5)之间的gap.
那么:锁住(3,5)到(6,7)之间的gap ,这个应该如何来实现或者说表示呢?
锁住(3,5) 到 (3,7),还是锁住(3,5)到(6,5),还是锁住(3,5)到(6,7)呢?
实际上锁住(3,5) 到 (3,7)也没有用,因为他可能插入(3,8),那么就剩下:
锁住(3,5)到(6,5)或者锁住(3,5)到(6,7)了,
但是(6,5)记录不存在,所以只能锁住(3,5)到(6,7)了。
所以(6,6)在范围内,而(6,8)不在范围呢。
如果允许(6,6)的插入的,那么gap锁就要改成:锁住(3,5)到(6,6)了,但是在插入(6,6)之前,记录(6,6)还不存在,无法锁住(3,5)到(6,6),
所以过程必须是这样的:释放(3,5)到(6,7)的gap锁,插入(6,6),修改gap锁为:锁住(3,5)到(6,6),
但是:在释放(3,5)到(6,7)的gap锁 到 插入(6,6),修改gap锁为3,5)到(6,6) 之间,有可能会有类似 (3,6)的记录insert进来,而这导致幻读,所以允许插入(6,6)是无法实现的。
不知道这样理解对不对。 |
|