RC模式下 select for update
的锁
记录是否存在 | where条件的索引类型 | 表锁类型 | 行锁类型 |
---|---|---|---|
不存在 | 无论什么索引 | IX意向排他锁 | 无 |
存在 | 唯一索引 | IX意向排他锁 | 两把X 排他行锁(分别对应唯一索引记录,主键记录 |
存在 | 主键索引 | IX意向排他锁 | 一把X 排他行锁(对应主键记录) |
存在 | 普通索引 | IX意向排他锁 | 两把X 排他行锁(分别对应普通索引记录,主键记录) |
存在 | 无索引 | IX意向排他锁 | 一把X 排他行锁(对应主键记录) |
特殊说明:
- IX意向排他锁:表锁,不影响插入
- where条件
无索引
且记录存在不是表锁的原因:- 若列上没有索引,MySQL会走聚簇(主键)索引进行全表扫描过滤。每条记录都会加上X锁。但是,为了效率考虑,MySQL在这方面进行了改进,在扫描过程中,若记录不满足过滤条件,会进行解锁操作。同时优化违背了2PL原则。