Skip to the content.

..

InnoDB中不同SQL语句设置的锁

参考:15.7.3 Locks Set by Different SQL Statements in InnoDB

14.7 InnoDB的锁和事务模型

锁定读(locking read), UPDATEDELETE 语句, 通常会在扫描到的索引记录(index record)上设置记录锁(record locks)。 不管SQL语句中是否包含WHERE条件都会上锁。因为InnoDB并不会记录确切的WHERE条件, 只知道自己扫描了哪些索引范围。 一般使用 临键锁(next-key locks), 这样就可以阻塞(block)其他事务将新行插入到前面的间隙(gap)中。 当然, 可以显式地禁用间隙锁(gap locking), 那也就不会使用临键锁。

如果搜索中用到了二级索引且该索引记录锁为排他锁, InnoDB还会检索相应的聚集索引记录(clustered index record)并对其上锁。

如果没找到索引, 那么MySQL会进行全表扫描(scan the entire table), 表中的每一行都将被锁定, 从而阻塞其他会话对表的所有插入。 所以创建良好的索引非常重要, 执行查询时就不需要去扫描很多不必要的行。

InnoDB为各种SQL语句设置的锁介绍如下: