MySQL 锁的算法(InnoDB存储引擎)

InnoDB存储引擎有3中行锁的算法设计,分别是Record Lock(单个行记录上的锁)、Gap Lock(间隙锁,锁定一个范围,但不包含记录本身)、Next-Key Lock(Record Lock+Gap Lock,锁定一个范围,并且锁定记录本身)。

Record Lock总是会锁住索引记录。如果InnoDB存储引擎表建立的时候没有设置任何一个索引,这时InnoDB存储引擎会使用隐式的主键来进行锁定。

Next-Key Lock是Record Lock和Gap Lock的一种结合的锁定算法,InnoDB对于行的查询都是采用这种锁定算法。对应不同的SQL查询语句,可以设置共享的(Share)Next-Key Lock和排他的(exlusive)Next-Key Lock。例如:CREATE TABLE t(a INT, PRIMARY KEY(a)) ENGINE=INNODB; 创建一张表 t ,插入值为1、2、3、4、7、8的6条记录。接着开启两个会话,会话A在一个事务中执行SELECT * FROM t WHERE a < 6 LOCK IN SHARE MODE; 会话B中执行 INSERT INTO t SELECT 6(或者5);会话B会一直blocking 。直到[Err] 1205 - Lock wait timeout exceeded; try restarting transaction。(这是在Navicat中执行等待一段时间之后的报错信息)。可见,在这种情况下,不论插入5或者6,都会被锁定。因为在 Next-Key Lock 算法下,锁定的是(-∞,6] 这个数值区间的所有数值。但是插入 9 这个数值是可以的,因为该记录不在锁定的范围内,而对于单个值的索引查询,不需要用到 Gap Lock,只要加一个 Record Lock 即可,因此InnoDB存储引擎会自己选择一个最小的算法模型。同样,对于上面的表 t ,会话A执行 SELECT * FROM t WHERE a = 7 LOCK IN SHARE MODE; 会话B执行 INSERT INTO t SELECT 6(或者5); 这时插入 5 或者 6 都是可行的了。需要注意的是,上面演示的两个例子都是在InnoDB的默认配置下,即事务的默认隔离级别为 Repeatable Read 的模式下,因为在 Repeatable Read 模式下,Next-Key Lock 算法是默认的行记录锁定算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值