简介
我们知道Myism支持表锁但不支持行锁,而InnoDB支持行锁和表锁,以下我们只讨论InnoDB
表锁
为了支持在不同粒度上进行加锁操作(允许行锁和表锁共存,实现多粒度锁机制),InnoDB 还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁
- 意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁
- 意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
由于InnoDB存储引擎支持的是行级别的锁,因此意向锁其实不会阻塞除全表扫以外的任何请求
意向锁作用
意向锁是在添加行锁之前添加。当再向一个表添加表级X锁的时候:
如果没有意向锁的话,则需要遍历所有整个表判断是否有行锁的存在,以免发生冲突。
如果有了意向锁,只需要判断该意向锁与即将添加的表级锁是否兼容即可。因为意向锁的存在代表了有行级锁的存在或者即将有行级锁的存在。因而无需遍历整个表,即可获取结果。
行锁
- 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。
- 排他锁(X):允许获得排他锁的事务更新数据,但是组织其他事务获得相同数据集的共享锁和排他锁。
行锁前提
InnoDB行锁是通过给索引上的索引项加锁来实现的,只有执行计划真正使用了索引,才能使用行锁