网站LOGO
逐暗者的麦田
页面加载中
7月22日
网站LOGO 逐暗者的麦田
一个java软件攻城狮
菜单
知识点整理(十三)——mysql读已提交级别下的锁
正文
  • 逐暗者的麦田
    一个java软件攻城狮
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    知识点整理(十三)——mysql读已提交级别下的锁
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    • 复制图片
    • 复制图片地址
    • 百度识图
    按住ctrl可打开默认菜单

    知识点整理(十三)——mysql读已提交级别下的锁

    shellingford · 原创 ·
    程序人生 · 知识点整理mysql
    共 2240 字 · 约 2 分钟 · 811
    本文最后更新于2023年08月18日,已经过了338天没有更新,若内容或图片失效,请留言反馈

    背景

    上一次我们了解mysql在事务隔离级别为可重复读的情况下,加锁的各种现象。

    知识点整理(十二)——mysql可重复读级别下的锁

    这次来看一下在读已提交级别下加锁的各种情况。

    实验

    主键索引

    等值更新

    命中

    sql 代码:
    update lock_test set f_num = 0 where id = 10;

    除了表意向排它锁之外,就加了主键的记录锁,这个和RR级别一样。

    未命中

    sql 代码:
    update lock_test set f_num = 0 where id = 11;

    这和RR级别不一样了,除了表意向排它锁之外,没有任何锁。

    范围更新

    命中

    sql 代码:
    update lock_test set f_num = 0 where id >= 5 and id <=15;

    这次也和RR级别不一样,除了表意向排它锁、主键记录锁之外没有间隙锁。

    未命中

    sql 代码:
    update lock_test set f_num = 0 where id >= 5 and id <=7;

    这次依旧和RR级别不一样,但是和等值主键查询未命中是一样的,除了表意向排它锁之外,没有任何锁。

    唯一索引

    等值更新

    命中

    sql 代码:
    update lock_test set f_num = 0 where f_uq = 10;

    数据库加了表意向排它锁、唯一索引记录锁、主键记录锁。

    未命中

    sql 代码:
    update lock_test set f_num = 0 where f_uq = 11;

    未命中时和主键更新是一样的,除了表意向排它锁之外,没有任何锁。

    范围更新

    命中

    sql 代码:
    update lock_test set f_num = 0 where f_uq >= 5 and f_uq <=15;

    和等值更新一样,数据库加了表意向排它锁、唯一索引记录锁、主键记录锁。

    未命中

    sql 代码:
    update lock_test set f_num = 0 where f_uq >= 5 and f_uq <=7;

    和等值更新一样,除了表意向排它锁之外,没有任何锁。

    普通索引

    • 等值更新
    sql 代码:
    update lock_test set f_num = 0 where f_index = 10;

    范围更新

    sql 代码:
    update lock_test set f_num = 0 where f_index >= 5 and f_index <=15;

    命中的时候都会加表意向排它锁、普通索引记录锁、主键记录锁。在未命中时,除了表意向排它锁之外,没有任何锁。

    无索引

    sql 代码:
    update lock_test set f_num = 0 where f_num = 10;
    sql 代码:
    update lock_test set f_num = 0 where f_num >= 5 and f_num <=15;

    和RR级别有很大区别,无论是等值更新还是范围更新,在命中时,只加了主键记录锁。未命中时,除了表意向排它锁之外,没有任何锁。

    总结

    总结一下,RC和RR级别加锁上来看,RR的加锁比较复杂,不仅多了间隙锁、临键锁,而且在未命中时也会加一些锁来保证可重复读。RC就比较简单,找到记录就加记录锁,没找到就不加锁。

    由此也可以看出,除非业务场景必须要用到可重复读特性,不然RC的性能比RR高很多。

    另外,虽然在RC中不使用索引更新比使用索引(唯一索引或普通索引)更新加的锁要少(只加主键记录锁),但是在没有索引的情况下数据库需要全表扫描,性能反而会下降,所以并不建议无索引更新。

    声明:本文由 shellingford(博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。
    我要发表评论 我要发表评论
    博客logo 逐暗者的麦田 一个java软件攻城狮
    MOEICP 萌ICP备20237379号 ICP 沪ICP备13037081号-2,沪ICP备13037081号-1,沪ICP备13037081号-3 又拍云 本站由又拍云提供CDN加速/云存储服务

    💻️ shellingford 7月14日 在线

    🕛

    本站已运行 2 年 331 天 7 小时 22 分

    🌳

    自豪地使用 Typecho 建站,并搭配 MyLife 主题
    逐暗者的麦田. © 2021 ~ 2024.
    网站logo

    逐暗者的麦田 一个java软件攻城狮