Gap lock在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。innodb的意向锁主要用户多粒度的锁并存的情况。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级上引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。innodb_locks_unsafe_for_binlog:静态参数,默认为0,表示启动gap lock,如果设置为1,表示禁用gap lock,这时mysql就只有record lock了,不过值得注意的是,即使了设置了1,关于外键和唯一键重复检查方面用到的gap lock依旧有效。建议是不要随便设置,我们这里设置只是做个简单的幻读演示,mysql后续的版本可能都会废弃掉这个参数了。

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)

详谈innodb的锁(record,gap,Next-Key lock)