疯狂编程网

  • 首页
  • 后端
    • GOLANG
    • PHP
  • 前端
  • 客户端
  • 服务器
  • AIGC
  • 开发工具
  • 代码人生
  • 关于本站
    • 联系我们
    • 免责声明
  1. 首页
  2. 服务器
  3. MYSQL
  4. 正文

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

2023年5月10日 271点热度 0人点赞 0条评论

元数据锁 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. 范围查询

标签: mysql
最后更新:2023年5月10日

大明

靠写代码养家的开发者。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 疯狂编程网. ALL RIGHTS RESERVED.

京ICP备2022013580号-1