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

打印 上一主题 下一主题

主题 572|帖子 572|积分 1720

元数据锁 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,尚未提交
  1. begin;
  2. 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,临键锁
  • 范围查询

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表