浅谈InnoDB的next-key locking策略


InnoDB 存储引擎默认隔离级别为可重复读(Repeatable Read),该隔离级别下加行锁采用的是next-key locking 策略。


InnoDB支持行锁(锁定字段含有索引的情况下,否则走表锁),但锁定方式并非简单的锁定指定行上的索引,而是分为3种锁定算法:
1)记录锁(Record Locks):锁定指定行的索引项
2)Gap Locks:锁定某一个范围内的索引,但不包括记录本身
3)间隙锁定(Next-Key Locks):锁定一个范围内的索引,并且锁定记录本身   Next-Key Locks = Record Locks + Gap Locks
A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record


InnoDB在默认配置下(隔离级别:可重复读;innodb_locks_unsafe_for_binlog=OFF:采用gap locking),对于索引的查询采用 next-key locks。这样做避免了幻读现象的产生。
By default, InnoDB operates in REPEATABLE READ transaction isolation level and with the innodb_locks_unsafe_for_binlog system variable disabled. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows
特别的,
1、当锁定的索引项含有唯一属性的时候,Next-Key Lock 会进行优化,将其降级为Record Lock,即仅锁住索引本身,不是范围。
2、当唯一索引是由多个列组成,而query仅查询多个列中的其中一个,则依然使用 Next-key lock。
3、通过主键或者唯一索引来锁定不存在的值,则依然使用 Next-key lock。。


强制关闭Gap Lock,仅使用记录锁从而避免阻塞(有幻读的风险):配置参数 innodb_locks_unsafe_for_binlog = 1 或者隔离级别设为 READ COMMITTED
By default, the value of innodb_locks_unsafe_for_binlog is 0 (disabled), which means that gap locking is enabled: InnoDB uses next-key locks for searches and index scans. To enable the variable, set it to 1. This causes gap locking to be disabled: InnoDB uses only index-record locks for searches and index scans.

The effects of enabling innodb_locks_unsafe_for_binlog are the same as setting the transaction isolation level toREAD COMMITTED



(1)采用next-key locks的InnoDB无法插入除了锁定行外的其他行的测试案例:

http://www.cnblogs.com/zhoujinyi/p/3435982.html

(2)何登成 --- MySQL加锁处理分析

http://hedengcheng.com/?p=771

(3)《深入浅出MySQL数据库开发优化与管理维护》开发篇

(4)https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html

(5)https://dev.mysql.com/doc/refman/5.5/en/innodb-consistent-read.html




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值