ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
InnoDB存储引擎支持行级锁,其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据。当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁 排它锁(X):允许拥有排它锁的事务修改或删除该行数据。当一个事务拥有一行的排他锁时,另外的事务在此行数据上无法获得共享锁和排它锁,只能等待第一个事务的锁释放 除了共享锁和排他锁之外,InnoDB也支持意图锁。该锁类型是属于表级锁,表明事务在后期会对该表的行施加共享锁或者排它锁。所以对意图锁也有两种类型: 共享意图锁(IS):事务将会对表的行施加共享锁 排他意图锁(IX):事务将会对表的行施加排它锁 ![](https://box.kancloud.cn/09ca6ae1558657b56a6a5ac8dd2889fc_1178x294.png) 所以决定一个事务请求为数据加锁时能否立即施加上锁,取决于该数据上已经存在的锁是否和请求的锁可以共存还是排斥关系,当相互之间是可以共存时则立即施加锁,当相互之间是排斥关系时则需要等待已经存在的锁被释放才能施加 innodb事务锁: http://blog.csdn.net/and1kaney/article/details/51213979 1、行级锁 行级锁是施加在索引行数据上的锁,比如SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE语句是在t.c1=10的索引行上增加锁,来阻止其他事务对对应索引行的insert/update/delete操作。 当一个InnoDB表没有任何索引时,则行级锁会施加在隐含创建的聚簇索引上 2、间隔锁 间隔锁是施加在索引记录之间的间隔上的锁,比如SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE语句,尽管有可能对c1字段来说当前表里没有=15的值,但还是会阻止=15的数据的插入操作,是因为间隔锁已经把索引查询范围内的间隔数据也都锁住了 间隔锁的使用只在部分事务隔离级别才是生效的 间隔锁只会阻止其他事务的插入操作