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

image-20230110185636088

image-20230110185716200

在A事务未提交前,由于上述锁的存在,那么其他事务不能做如下操作:

  • X:其他事务不能加 S/X,也就是其他的事务不能执行对该行数据执行DML,以及DQL(lock...)

    • 作用:事务A未执行完毕时,防止其他事务又修改行数据
  • IX:其他事务不能加 表读/写锁

  • SHARE_READ:其他事务不不能执行 DDL

行锁

加行锁的情况:

  1. 等值查询 (唯一索引),查询条件是表中不存在的记录。S(临键锁) -> 退化成 Gap,对查询条件后面那个数据加间隙锁 Gap

image-20230110205703467

image-20230110205616713

像这种情况,由于id=13这个数据不存在,会锁定12,14的这段间隙

  1. 等值查询 (非唯一索引),查询条件是表中存在的记录,向索引后面找,直到找到不为查询条件的那个索引,对它加 Gap。

    对查询条件加 S,临键锁

  2. 范围查询

posted @ 2023-01-10 21:00  pzistart  阅读(430)  评论(0编辑  收藏  举报