一、InnoDB模式:
(1)行锁
(1.1)行锁分类:
- 共享锁(S):允许一个事务去读一行,阻止其它事务获得相同数据集的排它锁
- 排它锁(X):允许获得排它锁的事务更新数据,阻止其它事务取得相同数据集的共享锁和排它锁
- 意向共享锁(IS):事务在给一个数据行加共享锁前必须先取得该表的IS锁
- 意向排它锁(IX):事务在给一个数据行加排它锁前必须先取得该表的IX锁
共享锁 | 排它锁 | 意向共享锁 | 意向排它锁 | |
共享锁 | 兼容 | 互斥 | 兼容 | 互斥 |
排它锁 | 互斥 | 互斥 | 互斥 | 互斥 |
意向共享锁 | 兼容 | 互斥 | 兼容 | 兼容 |
意向排它锁 | 互斥 | 互斥 | 兼容 | 兼容 |
技巧:意向锁之间是兼容的,排它锁与任何锁之间是互斥的,意向排它锁又与共享锁和排它锁互斥
(1.2)行锁实现方式:
- InnoDB行锁是通过给索引项上的索引加锁来实现的,意味着只有通过索引条件检索数据,才会使用行级锁,否则使用表锁
- 只有执行计划真正使用了索引,才能使用行锁,即便在条件中使用了索引字段,但是否使用索引是由MySQL通过判断不同执行计划的代价来决定的,若认为全表扫描效率更高,就不会使用索引,这种情况下将会使用表锁,而不是行锁
- 由于行锁是针对索引加的锁,不是针对记录加的锁,所以虽然多个session是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的
(2)间隙锁(定义:间隙锁是封锁索引记录中的间隔)
(2.1)唯一索引: (1)记录不存在,会产生间隙索引(2)范围查询,会产生间隙锁(3)记录存在,不会产生间隙锁
(2.2)普通索引:不管是何种查询,只要加锁,都会产生间隙锁