Mysql中的锁:表、MDL、意向锁、行锁
元数据锁 SHARE_READ/EXCLUSIVE:
- 共享锁:在DQL/DML的时候给表加 SHARE_READ/WRITE 锁,与排它锁互斥
- 作用:在A事务未提交的情况下,B事务不能修改表结构
- 排他锁:在DDL的时候给表加EXCLUSIVE锁,与共享/排他锁都互斥。
- 作用:修改表结构的时候不允许执行DQL/DML
意向锁 IS/IX:
-
意向共享锁 IS:执行select ... lock in share mode 时,会加行共享锁,以及对表加 IS
-
意向写锁 IX:执行DML语句时,会加行写锁,同时对表加 IX
-
作用:可以更快的知道能否加表锁,否则的话要一行一行的扫描来判断是否能够加表锁
对于同一张表,表锁和行锁不能共存
一个 sql 的加锁情况
A事务执行DML,尚未提交
begin;
update tb_user set name = 'ccc' where id = 1;
where条件 满足索引,那么就会加给该行记录加行排他锁 X、给该表意向写锁 IX 和 元数据共享锁 SHARE_READ
在A事务未提交前,由于上述锁的存在,那么其他事务不能做如下操作:
-
X:其他事务不能加 S/X,也就是其他的事务不能执行对该行数据执行DML,以及DQL(lock...)
- 作用:事务A未执行完毕时,防止其他事务又修改行数据
-
IX:其他事务不能加 表读/写锁
-
SHARE_READ:其他事务不不能执行 DDL
行锁
加行锁的情况:
- 等值查询 (唯一索引),查询条件是表中不存在的记录。S(临键锁) -> 退化成 Gap,对查询条件后面那个数据加间隙锁 Gap
像这种情况,由于id=13这个数据不存在,会锁定12,14的这段间隙
-
等值查询 (非唯一索引),查询条件是表中存在的记录,向索引后面找,直到找到不为查询条件的那个索引,对它加 Gap。
对查询条件加 S,临键锁
-
范围查询