在锁读的过程中,一个update 或一个delete 经常设置记录锁在每一个索引记录上。这与where条件中是否排除此条索引记录没有关系。innodb认不出扩展的where扩展条件,只会认出那些索引区间被扫描。The locks are normally next-key locks that also block inserts into the “gap” immediately before the record。通常,gap locking不能显示使用,导致next-key locking 也不能用。大多数情况下,事务隔离级别也会影响lock的设置。
如果一个二级索引在查找记录过程中使用,那么索引记录被设置x-lock。如果没有满足的索引,那么将是全表扫描,表中每一条记录都会比锁定。并发降低,效率下降,创建好的索引会扫描不必要的记录。
select ..... for update or select .... lock in share mode 下,扫描记录 请求locks。
innodb 设定的特定锁类型
select ......from 锁定读,读取数据库快照而不用设置locks。在serializable level,在索引记录将设置 next-key locks
select .... from ...lock in share mode 在全部的索引记录上设置一个共享的next-key locks,只有扫描是唯一索引时设置record lock。
select.... from .... for update 在全部的索引记录上设置一个排他的next-key locks,只有扫描是唯一索引时设置索引记录锁。
update.....where ....设置排他的next-key lock。但是只有扫描唯一索引记录时设定索引记录锁
delete......where.... 设置排他的next-key lock。但是只有扫描唯一索引记录时设定索引记录锁