https://www.cnblogs.com/zhoujinyi/p/3435982.html
深入了解mysql–gap locks,Next-Key Locks
https://blog.csdn.net/qq_20597727/article/details/87308709
gap锁的左开右闭原则
假如有会话1(已开启事务):
select * from intest where num>14 and num<16 for update;
即gap锁的范围是(14,16】
那么会话2的事务中只能插入num<14或num>=16的数据,否则需要等待会话1的锁的释放
注意,使用悲观锁,需要关闭mysql的自动提交功能,将 set autocommit = 0;
注意,mysql中的行级锁是基于索引的,如果sql没有走索引,那将使用表级锁把整张表锁住。
非唯一索引:
select * from tablename where age=10 for update;
10前和后的间隙不能插入数据
如果age是主键或者唯一索引,那么10前面和后面可以被插入数据
如果age是主键或唯一索引,且select * from tablename where age>10 for update;
那么10后面不可以被插入数据
总结:
1、主键或者唯一索引的等值查询for update 的情况下不会产生间隙锁,查询范围的情况下会产生间隙锁
2、非唯一索引等值查询会产生间隙锁,锁范围:(a,查询的值)(查询的值,b),a和b分别表示查询的值左右两边的数字。查询范围的情况下也会产生间隙锁