Mysql中的锁:表MDL意向锁行锁

Posted pzistart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

行锁

加行锁的情况:

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

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

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

    对查询条件加 S,临键锁

  2. 范围查询

以上是关于Mysql中的锁:表MDL意向锁行锁的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的锁(表锁行锁,共享锁,排它锁,间隙锁)

MySQL——innodb锁

mysql数据库表锁行锁

mysql数据库表锁行锁

mysql数据库表锁行锁

MySQL ---- 共享锁独占锁行锁表锁