mysql间隙锁next-key

本文深入解析SQL事务处理中的Next-Key Lock机制,解释其作用原理及如何避免万圣节问题,通过实例说明在transaction1中执行select查询并加锁时,如何确保数据一致性,以及transaction2更新数据时需要等待transaction1的commit操作,最终实现高效且无冲突的数据更新过程。

如果在transaction1(Tr1)进行一个
select * from table1 where id < 4 lock in share mode.

这里会在table1上加一个next_key lock(间隙锁),基本原理是什么呢?大致是这样的,内存中有一个lock hash。是一个key(类似于tableid+pageid+offset)到value(所加的锁)--- 这就是行锁的原理。所以 id<4的话,会给0 1 2 4(假设当前数据库没有3)加上行锁,这样就保证了不会出现插入id=3.5这种事情的发生。

++++++++++++++++++++++++++++++++++++++++++

小插曲:
万圣节 问题
update table1 set c1=c1+2 where  c1<10; 如果使用index(c1)进行存取。
如果按照正常思路,取出第一条c1=1的将其+2,然后重新插入表中,同时要调整index(c1)。因为是按照索引顺序的一条一条的取出来的,
这样待会又会把刚刚更新过的数据,取出来再重新加了一次,导致错误的发生。----------这就是《万圣节问题》

解决方案:
使用RID list prefetch技术,先将要更改的数据取出来,放到一个temp table里面,每次取数据都是从temp table里面取,这样就不会重复的取出已经更新的数据了。

+++++++++++++++++++++++++++++++++++++++++++

所以 在transaction2(Tr2)进行一个
update table1 set id=5 where id=4;
会等待。。知道Tr1 commit之后才能更新成功。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值