MySQL 锁那些事

    • Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?
    • Q2 : 行锁是如何实现的?什么情况下会使用行锁?
    • Q3 : 四种事务隔离形式的行锁有什么不一样?
        • 读未提交
        • 读提交
        • 可重复读
        • 串行
    • Q4 : MySQL 的读写都是怎样加锁的?
    • Q5 : 需要注意什么?

Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?

  1. 全局 - 锁定全局(库)的数据,所有写全部阻塞,只能写.
    • 只有做全库逻辑备份才会用
  2. 表锁 - 锁定一个表的数据,避免数据更新时的并发问题
  3. 行锁 - 锁定某一行/一个区间(间隙)的数据,避免数据更新时的并发问题
    • 行锁是通过索引实现的,如果没有索引,那么将会使用表锁.

Q2 : 行锁是如何实现的?什么情况下会使用行锁?

  • MySQL 如何加表锁:
    • 直接在整个表上加锁,限制全表的读写访问(锁全表)

那么行锁是如何工作的呢?

行锁是通过索引实现的,主要分为两个阶段

  • 二级索引(间隙/临建)加锁并命中数据(主键 id)

    • 加锁方式: 先根据边界条件或者等值条件命中情况决定加锁的范围
      • 没命中: 索引无法命中不存在的 key,但是要避免数据在(事务)执行期间新数据的加入导致数据混乱问题,就会在未命中前后 key 区间加间隙锁,保证执行期间没有数据插入
      • 其他: 如果锁范围查询就会对查询范围进行加锁,在结合刚刚的未命中区间,就是二级索引加锁的区间
    • 作用: 限制区间的数据插入,避免区间内数据的插入导致结果错误问题
  • 主键索引加锁

    • 根据上面二级索引命中的主键 id,对每个 id 的数据行进行加锁
    • 作用: 避免事务执行期间数据被修改

Q3 : 四种事务隔离形式的行锁有什么不一样?

读未提交

有的人说读提交不会显示加锁,我觉得不加锁不科学,不加锁百分百会出现读写并发冲突问题,一定会报错;
但是 MySQL 不会做一个有问题的东西给大家用,那为什么读未提交不会阻塞其他事务,我想只有一个解释锁的生命周期(持有时间)

  • 锁持有时间是任务结束(并不是事务结束),不会加间隙锁
  • 优点: 锁持有时间短,对其他事务影响小
  • 缺点: 脏读问题
读提交
  • 锁的生命周期锁整个事务,不会加间隙锁
  • 优点: 没有间隙锁,对其他事务(在间隙的数据插入)性能影响小
  • 缺点: 数据幻读问题
    (思考: 有锁的话读提交还有不可重复读的问题吗?)
可重复读
  • 锁的生命周期锁整个事务,会加间隙锁
  • 优点: 避免数据幻读
  • 缺点: 略微降低数据写入的性能
串行
  • 最严格的隔离级别,它通过加 范围锁 或 表锁 来确保事务之间没有冲突,所有读取的数据都必须是其他事务已提交的数据。
  • 由于避免了幻读,它会在 查询范围 上加 间隙锁 或 表锁,防止其他事务在查询范围内插入或修改数据。
    (我觉得串行不需要锁,单线程的执行事务就没有并发问题了呀,为什么需要锁?搞不懂)

Q4 : MySQL 的读写都是怎样加锁的?

  • MySQL 的普通查询是不会加锁的,而是通过 mvcc 去进行多版本并发控制

  • MySQL 写是通过锁控制的,具体锁的程度根据索引情况与隔离程度而定

Q5 : 需要注意什么?

  • 没有索引锁全表

行锁只有索引的条件下才会生效,没有索引会锁全表,造成其他线程阻塞,连接大量堆积,严重影响性能.

没有索引的查询与更新数据在并发情况下表现更差.

索引不仅会减少磁盘 io 的次数加快数据的查询,还可以提高并发情况下的读写性能表现.

参考:
https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E5%94%AF%E4%B8%80%E7%B4%A2%E5%BC%95%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2
https://juejin.cn/post/6931752749545553933

https://blog.csdn.net/weixin_43994761/article/details/132250415
https://blog.unclezs.com/pages/180d74/#%E7%AE%80%E4%BB%8B

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/500691.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis模版空库怎么用(一)

这里以某个项目的数据为例: 可以看到,属性表中全部只有列标题,无数据内容 可能有些人会认为空库是用来往里面加入信息的,其实不是,正确的用法如下: 一、下图是我演示用的数据,我们可以看到其中…

GJB系统设计说明模板

GJB系统设计说明模板及详解 1 范围 1.1 标识 1.2 系统概述 1.3 文档概述 2 引用文档 GJB XXX XXX XXX; XXX XXX。 前2章通用不再赘述 3 系统级设计决策 系统设计决策的目的:对系统规格说明中的关键需求(包括功能、质量属性和设计约束)进行分析,得到系统级概念性架构…

某小程序sign签名参数逆向分析

文章目录 1. 写在前面2. 接口分析3. 分析还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

2000-2020年各省财政一般预算支出面板数据

2000-2020年各省财政一般预算支出面板数据 1、时间:2000-2020年 2、来源:国家统计局 3、指标:年份、省份、地方财政一般预算支出 4、范围:31省 指标解释:地方财政一般预算支出‌是指地方ZF根据预算安排&#xff0…

[羊城杯 2024]1z_misc

得到FL4G.zip和天机不可泄露.txt文件,其中压缩包需要解压密码: 二十八星宿: 东方苍龙七宿:角、亢、氐、房、心、尾、箕 南方朱雀七宿:鬼、井、柳、星、张、翼、轸 西方白虎七宿:奎、娄、胃、昴、毕、觜、…

右值引用全面剖析

为什么要有右值引用,右值引用出现前程序员们的困境: 在右值引用出现以前,想要把一块内存空间里的内容放到另一块内存空间,只能再开辟一块内存,然后将原来内存里的内容复制到新开辟的内存里,然后再把原来的…

mac下载Homebrew安装nvm

通过Homebrew安装 - 国内下载地址 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装nvm brew install nvm 配置nvm环境变量 export NVM_DIR“$HOME/.nvm” [ -s “/usr/local/opt/nvm/nvm.sh” ] && . “/usr/…

解决chatgpt(mac app登陆)出现报错:获取您的 SSO 信息时出错

由于我们是app登陆的,不能直接修改网站的链接,将 URL 的域名部分从 auth.openai.com 变更为 auth0.openai.com,然后加载新的地址,这时候应该就可以正常登录或注册了。 所以我们使用邮箱先载入auth0的地址,再更改自己的…

C#编写的盘符图标修改器 - 开源研究系列文章

这天在网上遇到一个Windows的盘符图标修改软件,但是它那个是.net framework 2.0的,所以就将其改成4.8.1的了,用于Windows 11等默认不安装2.0库的操作系统里使用。 1、 项目目录; 2、 源码介绍; 它直接进行注册表的修改…

【第二部分--Python之基础】03 容器类型的数据

Python内置的数据类型如序列(列表、元组等)、集合和字典等可以容纳多项数据,我们称它们为容器类型的数据。 序列 序列(sequence)是一种可迭代的、元素有序的容器类型的数据。 序列包括列表(list&#xff…

HTML5实现好看的二十四节气网页源码

HTML5实现好看的新年春节元旦网站源码 前言一、设计来源1.1 主界面1.2 关于我们界面1.3 春季节气界面1.4 夏季节气界面1.5 秋季节气界面1.6 冬季节气界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的二十四节气网页源码,春季节气&#xf…

走进深圳华为总部参观研学

在这个科技日新月异的时代,每一次与行业标杆企业领先者对话,都是开眼界的好时机。华研标杆游学高老师组织了一场企业家参访团体考察,带大家去到深圳华为总部研学,亲身感受科技巨头的风采,一起探讨未来的发展。 第一站-…

【unity错误】Unity 6 LTS 打开就报错Assertion failed on expressionxxx?

unity6发布已经有一段时间了,如果目前你已经使用了unity6进行项目开发,可能打开会发现如下报错 Assertion failed on expression: ‘!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) …

集线器,交换机,路由器,mac地址和ip地址知识记录总结

一篇很不错的视频简介 基本功能 从使用方面来说,都是为了网络传输的标识,和机器确定访问对象 集线器、交换机和路由器 常听到路由器和集线器,下面是区别: 集线器 集线器:一个简单的物理扩展接口数量的物理硬件。…

【ArcGISPro/GeoScenePro】检查并处理高程数据

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 数字高程模型 (DEM) 是一种栅格,可显示地面或地形的高程。 数字表面模型 (DSM) 是另一种高程栅格,可显示表面的高度,例如建筑物或树冠的顶部。 您需要准备 DEM 和 DSM 以供分析…

《计算机组成及汇编语言原理》阅读笔记:p177-p177

《计算机组成及汇编语言原理》学习第 13 天,p177-p177 总结,总计 1 页。 一、技术总结 1.real mode A programming model where the program has access to the entire capability of the machine, bypassing security and memory management. Useful…

珞珈一号夜光遥感数据地理配准,栅格数据地理配准

目录 一、夜光数据下载: 二、夜光遥感数据地理配准 三、计算夜光数据值 四、辐射定标 五、以表格显示分区统计 五、结果验证 夜光数据位置和路网位置不匹配,虽然都是WGS84坐标系,不匹配!!!不要看到就直接…

python学习笔记—12—

1. 布尔类型 (1) 定义 (2) 比较运算符 (3) 代码演示 1. 手动定义 bool_1 True bool_2 False print(f"bool_1的内容是:{bool_1}, 类型是:{type(bool_1)}") print(f"bool_2的内容是:{bool_2}, 类型是:{type(bool…

Redis 使用redisTemplate获取某个规则下的key的全量数据(示例Set结构)

如下是redis中存储的数据结构 我想取key以favorites:结尾的所有数据 Redis 的 SCAN 命令用于迭代数据库中的键,支持通过模式过滤结果。模式规则基于 Redis 的通配符匹配语法,类似于文件名匹配规则: *:匹配零个或多个字符。?&…

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)

CertiK《Hack3d:2024年度安全报告》现已发布,本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元,同比增幅高达31.61%;其中,12月的损失金额最少。过去一年,网络钓鱼攻击和私钥泄露…