打卡
今天学习了<<mysql45讲>>里面提到了gap锁,以前基本不懂什么是gap锁,现在明白一些些了.
gap锁是间隙锁,只有在隔离等级为可重复读的时候才有,如果隔离等级是读提交,是没有gap锁的.
首先我们知道读锁和写锁之间的关系,写锁和写锁之间是不冲突的,但是写锁和读锁之间是冲突的.写锁与写锁之间也是冲突的.
gap锁和gap锁之间是不冲突的,也是因为这个情况,所以容易引发并发的时候死锁问题.
当我们设置隔离等级为可重复读的时候,使用完全匹配索引.使用下面的语句
select * from student where age = 12 for update;
如果age上面没有索引的话,那么就不仅仅会锁住age=12这一行,而是去主键索引上找到匹配的age进行比对,扫描到的行都会被锁住.
假设数据库里面有age 0 10 13 的那么就会锁住 (0,13)这个区间的行记录.
假设并发去插入,可能A和B共同获取到了这个区间的gap锁,而又同时插入就会造成死锁问题了.
具体锁的规则我要去看下一讲了.







网友评论