`

innodb的记录锁、gap锁、next-key锁

 
阅读更多

相关文章见:

http://dev.mysql.com/doc/refman/5.0/en/innodb-record-level-locks.html

http://hi.baidu.com/fishhust/blog/item/c4900b8bff4a2e1bc8fc7a81.html

http://dev.mysql.com/doc/refman/5.0/en/innodb-next-key-locking.html


对文章的总结如下:

(1)记录锁:在行相应的索引记录上的锁

(2)gap锁:是在索引记录间歇上的锁

(3)next-key锁:是记录锁和在此索引记录之前的gap上的锁的结合

(4)innodb行锁的加锁方式: 当根据innodb表的索引搜索时, 设置共享锁和排它锁在索引记录上

(5)行锁实际上是索引锁

(6)innodb_locks_unsafe_for_binlog:

当为0时 (disabled), 这个开启了gap锁;设置为1,关闭gap锁(这会导致幻读,引起主从同步不一致)。例子见http://book.51cto.com/art/200803/68129.htm

(7)开启这个选项innodb_locks_unsafe_for_binlog并不关闭gap锁在外键检查方面的作用

(8)在UPDATE和DELETE时,innodb首先对遇到的每一行加行锁;如果innodb_locks_unsafe_for_binlog开启,那么不匹配的行上的锁将被释放;如果未开启,不匹配的行上的锁也不释放,直到事务结束

(9)即使innodb表上没有索引,也会使用内部的clustered index来进行锁定;

(10)innodb除主键的索引之外的其他索引和clustered index在内部是建立一张索引对应表;当利用其他索引扫描记录时,对其他索引加的锁最后都转换为对clustered index加的锁

(11)在UPDATE模式下,对检索中遇到的记录加排它锁;在INSERT...SELECT模式下,对检索中遇到的记录加共享锁;在INSERT模式下,对检索中遇到的记录加排它锁;在DELETE模式下,对检索中遇到的记录加排它锁

(12)在使用unique index进行搜索,并且只返回一行时,不使用gap锁

(13)next-key锁举例:假设索引包括10,11,13,20,则next-key锁为:(negative infinity, 10], (10, 11], (11, 13], (13, 20], (20, positive infinity)

(14)使用next-key锁可以预防幻读

(15)gap锁在read_committed下或当 innodb_locks_unsafe_for_binlog=on时被关闭;当在这种情况下时,不匹配的行上的锁将被释放 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics