
共享锁和排它锁
- 共享锁(shared locks:s lock)
- 排它锁(exclusive locks:x lock)
意向锁(intention locks)- 表级别
- 共享意向锁(intention shared lock -> IS)
- 排他意向锁(intention exclusive lock -> IX)
意向锁与行锁间的关系
| X | IX | S | IS | |
|---|---|---|---|---|
| X | Conflict | Conflict | Conflict | Conflict |
| IX | Conflict | Compatible | Conflict | Conflict |
| S | Conflict | Conflict | Compatible | Compatible |
| IS | Conflict | Compatible | Compatible | Compatible |
意向锁注意事项
- 事务申请一个表中某行记录的共享锁前,必须申请该表的IS lock或更强的锁
- 事务申请一个表中某行记录的排他锁前,必须申请该表的IX lock
- 意向锁只阻塞表级别的加锁请求(for example,
LOCK TABLES ... WRITE)。意图锁主要是为了表明某些客户端正在或将要锁住表中的某一行。
记录锁(record lock)
记录锁也叫做行锁,是用来在一条索引记录上加锁来实现。例如SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 会阻止其他事务插入、更新或删除t.c1值为10的数据行。
记录锁通常通过锁住索引记录来实现,即便一个mysql的table没有定义索引,在这种情况下InnoDB会创建一个隐藏的索引来用该索引来加记录锁。See Section 15.6.2.1, “Clustered and Secondary Indexes”.