码农知识堂 - 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

  • 相关阅读:
    OpenShift 4 - 在 Windows 上安装 OpenShift 单机开发环境
    sqllab第十六关通关笔记
    Mybatis-plus生成工具代码
    Response响应数据 [JavaWeb][Servlet]
    Xcode14 正式版编译报错‘ does not contain bitcode.解决方案
    Qt QPen
    神仙级Python入门教程(非常详细),从零基础入门到精通,从看这篇开始
    智慧用电解决方案-最新全套文件
    DM@数理逻辑@命题公式及其赋值@真值表@公式分类
    脚手架(vue-cli)创建Vue项目看这篇就够了
  • 原文地址:https://blog.csdn.net/ChinaYangJu/article/details/127939230
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号