码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL8.0优化 - 锁 - 按加锁的方式划分:显示锁、隐式锁


    文章目录

    • 学习资料
    • 锁的不同角度分类
      • 锁的分类图如下
      • 按加锁的方式划分:显示锁、隐式锁
        • 隐式锁
        • 显式锁


    学习资料

    【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】
    【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java

    锁的不同角度分类

    锁的分类图如下

    在这里插入图片描述

    按加锁的方式划分:显示锁、隐式锁

    隐式锁

    一个事务在执行INSERT操作时,如果即将插入的间隙已经被其他事务加了gap锁,那么本次INSERT操作会阻塞,并且当前事务会在该间隙上加一个插入意向锁,否则一般情况下INSERT操作时不加锁的。那如果一个事务首先插入了一条记录(此时并没有在内存生产该记录关联的锁结构),然后另一个事务:

    立即使用SELECT ... LOCK IN SHARE MODE语句读取这条记录,也就是要获取这条记录的S锁,或者使用SELECT ... FOR UPDATE语句读取这条记录,也就是获取这条记录的X锁,怎么办?
    如果允许这种情况的发生,那么可能产生脏读问题。
    立即修改这条记录,也就是要获取这条记录的X锁,怎么办?
    如果允许这种情况的发生,那么可能产生脏写问题。
    这时候我们前边提过的事务id又要起作用了。我们把聚簇索引和二级索引中的记录分开看一下:

    情景一:对于聚簇索引记录来说,有一个trx_id隐藏列,该隐藏列记录着最后改动该记录的事务id。那么如果当前事务中新插入一条聚簇索引记录后,该记录的trx_id隐藏列代表的就是当前事务的事务id,如果其他事务此时想对该记录添加S锁或者X锁时,首先会看一下该记录的trx_id隐藏列代表的事务是否是当前的活跃事务,如果是的话,那么就帮助当前事务创建一个X锁(也就是为当前事务创建一个锁结构,is_waiting属性false),然后自己进入等待状态(也就是为自己也创建一个锁结构,is_waiting属性是true)。

    情景二:对于二级索引记录来说,本身并没有trx_id隐藏列,但是在二级索引页面的Page Header部分有一个PAGE_MAX_TRX_ID属性,该属性代表对该页面做改动的最大的事务id,如果PAGE_MAX_TRX_ID属性值小于当前最小的活跃事务id,那么说明对该页面做修改的事务都已经提交了,否则就需要在页面中定位到对应的二级索引记录,然后回表找到它对应的聚簇索引记录,然后再重复情景一的做法。

    即:一个事务对新插入的记录可以不显式的加锁(生成一个锁结构),但是由于事务id的存在,相当于加了一个隐式锁。别的事务在对这条记录加S锁或者X锁时,由于隐式锁的存在,会先帮助当前事务生成一个锁结构,然后自己再生成一个锁结构后进入等待状态。隐式锁是一种延迟加锁的机制,从而来减少加锁的数量。

    隐式锁在实际内存对象中并不含有这个锁信息。只有当产生锁等待时,隐式锁转化为显示锁。

    显式锁

    通过特定的语句进行加锁,我们一般称之为显示加锁,例如:
    显示加共享锁:
    select .... lock in share mode
    显示加排它锁:
    select .... for update

  • 相关阅读:
    HC32L110 在 Ubuntu 下使用 J-Link 烧录
    S5的未来:即将到来的协议改进和可能性
    C++Builder:定时器Timer控件
    电压放大器在铁电材料表征中的应用有哪些
    Android学习之路(16) Android 数据库Litepal
    MLX90640 红外热成像仪测温传感器模块开发笔记(十) 成果展示-红眼睛相机
    订水商城H5实战教程-03用户协议
    Python3 异步编程简介
    阿里最新总结的 spring 学习笔记PDF版分享,这是我见过这牛逼的spring全家桶
    Java安全
  • 原文地址:https://blog.csdn.net/ChinaYangJu/article/details/127939230
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号