MySql锁知识记录积累(一)

这篇具有很好参考价值的文章主要介绍了MySql锁知识记录积累(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.关于脏读、幻读和不可重复读

脏读:一个事务A读取到了另一个事务B未提交的数据,叫做脏读
不可重复读:事务A被事务B干扰到了!在事务A范围内,两个相同的查询,读取同一条记录,却反返回了不同的结果,即不可重复读
幻读:事务A查询一个范围内的结果集,另一个并发事务B往这个范围中插入/删除了数据,并提交。然后事务A再次查询,结果查询到了不同的结果,这就是幻读。

2.事务隔离级别

MySql锁知识记录积累(一)
在并发情况下,读未提交的事务隔离级别下,是不加锁的会存在 脏读、幻读和不可重复读的问题

3.InnoDB七种锁介绍

MySql锁知识记录积累(一)

3.1共享/排他锁

InnoDB存储引擎实现了两种标准的行级锁:共享锁-Share(简称S锁)、排他锁(简称X锁)

  • 共享锁:在事务想要读取一条记录的时候,需要先获取该记录的共享锁。
  • 排他锁:在事务想要修改一条记录的时候,需要先获取该记录的排他锁。

共享锁存在的意义

  • 存在若干个事务想要读取一条记录,需要先获得该记录的共享锁,是为了避免该记录被其他事务所修改。

排他锁存在的意义

  • 当一个事务想要修改一条记录,需要先获得该记录的排他锁,此时其他事务无法读取该数据,直到排他锁释放。

3.2意向锁

意向锁解释:不与行级别锁冲突的表级锁。未来某个时刻,事务可能需要加共享锁或者排他锁的时候,先提前声明一个意向。是一个表级别的锁。

为什么需要意向锁?

  • 假设一个事务A获取了表中一行数据的排他锁
  • 此时事务B想要读取全表数据,需要对整张表加共享锁,因此需要保证表中不存在排他锁
  • 问题来了
    • 事务B想要判断表中是否存在排他锁,难道要全表遍历?
    • 为了解决该问题,因此有了意向锁

实际运行过程

  • 当一个事务A想要对表中的数据进行 读取/修改 的时候,需要向增加一个全表级别的 意向共享锁/意向排他锁
  • 此时其他事务想要对全表中的数据进行修改,就会发现表中存在全表级别的 意向锁,从而不需要避免了全表找锁

3.3记录锁

记录锁是粒度最小的锁,仅仅锁住一行。
记录锁加在索引上,如果一张表中没有索引,InnoDB会隐式创建一个索引,并用该索引加记录锁。
记录锁关键词lock_mode X locks rec but not gap

3.4间隙锁(Gap Lock)

间隙锁是一种加在两个索引之间的锁,或者加在第一个索引之前,最后一个索引之后的间隙,锁住的是一个区间。
lock_mode X locks gap before rec
为了解决幻读问题
间隙锁左右都是开区间

当SQL语句查询范围数据的时候,会对查询的范围区间加上间隙锁。
此时,其他事务无法在加上了间隙锁的范围区间内插入新的数据,避免了幻读。

间隙锁仅在 RR 隔离级别下出现

PS:在RR(可重复读)的隔离级别下,普通查询是快照读,不会发生幻读。如果使用“当前读”(即:for update)才有可能发生幻读

3.5临键锁(Next-Key Lock)

临键锁:锁住索引本身和索引之前的间隙,左开右闭区间

临键锁的加锁场景:当SQL使用非唯一索引的条件进行数据检索的时候,会给匹配到的行加上临键锁

如下表数据

id name sex age
1 kk 10
2 lily 20
3 LiNa 30
4 QQ 40
5 HH 60
6 ZZ 80
7 NN 100

在该表的 age 列增加普通非空唯一索引。
那么临键锁可能的区间为

  • (负无穷, 10] (10, 20] (20, 30] (30, 40] (40, 60] (60, 80] (80, 100] (100, 正无穷)

临键锁的具体产生场景:

  • 如果是等值查询且记录存在,即 begin; select * from xxx where age = 30 for update;
    • 此时仅仅会锁住 age=30 这一行记录
  • 等值查询且记录不存在,即 begin; select * from xxx where agen = 45 for update;
    • 此时会锁住 [40, 60] 的间隙 若 40 <= age <= 60 则会插入失败
  • 范围查询 select * from where age >= 25 and age <=35
    • 首先查询 age = 25 的记录判断是否存在,不存在 临键锁 (20, 30]
    • 同上 age = 35 不存在,加锁 (30, 40]
    • 总加速范围 Next-Key Lock (20, 40]

加锁规律总结

唯一索引等值查询

  • 查询记录存在,记录锁 Record Lock
  • 不存在,间隙锁 Gap Lock

唯一索引范围查询

  • 间隙锁或记录锁

非 唯一索引等值查询

  • 记录存在 Next-key Lock 临键锁 和 间隙锁 Gap Lock
  • 记录不存在 间隙锁 Gap Lock

非 唯一索引范围查询

  • Next-Key Lock 临键锁

3.6插入意向锁

在执行插入一行记录操作之前设置的一种间隙锁。
解决的问题:

  • 多个事务,在同一个索引范围区间内,执行插入操作的时候,如果插入的数据不冲突,就不会阻塞彼此。
  • 假设 数据范围 [7, 100] 多个时候在范围区间内插入不同数据的时候不会阻塞

3.7自增锁

特殊的表级别锁,针对 AUTO_INCREMENT文章来源地址https://www.toymoban.com/news/detail-488975.html

  • 如果表中新增一条数据,就会持有自增锁
  • 此时其他事务向表中插入数据必须等待自增锁释放,以便保证连续的主键值

到了这里,关于MySql锁知识记录积累(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 幻读

    假设这样一个场景: 对于T3 查到的(0,0,5)不是幻读,T5查到的(1,1,5)才是幻读。( 幻读仅专指“新插入的行 ) 注:上面的图并不会实际发生,只是为了更好的引出问题而写的,实际上MySQL已经针对幻读问题做了解决方案(next-key lock下面讲),实际情况T5不会查到新

    2024年02月06日
    浏览(41)
  • Mysql 幻读,当前读和快照读

    什么是幻读 幻读 指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户在读取该范围的数据行时,会发现有新增行数据; mysql 在RR(可重复读)隔离级别利用间隙锁机制下一定程度上解决了幻读。 这里的一定程度上 是指 只有 快照读 的情况。 当前读

    2024年02月12日
    浏览(34)
  • 你知道MySQL是如何解决幻读的吗?

    SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,可以解决不同的并发问题,如下图所示。当然MySQL也基本遵循了这个标准,但是在实现上稍有不同。 本文重点探讨下MySQL是如何解决幻读问题的,首先 串行化 隔离级别铁定

    2024年02月05日
    浏览(31)
  • MySQL 8.0 OCP认证精讲视频、环境和题库之四 多实例启动 缓存、事务、脏读

        1、编辑选项文件,指定以下选项:     [mysqld]         basedir=/mysql80         datadir=/mysql80/data1         socket=/mysql80/data1/mysqld.sock         pid-file=/mysql80/data1/mysqld.pid         log-error=/mysql80/data1/mysqld.log     2、初始化         /mysql80/bin/mysqld --defaults-file=/mys

    2024年02月07日
    浏览(29)
  • 【MySQL】MVCC是如何解决快照读下的幻读问题的

    我们从上文中了解到 InnoDB 默认的事务隔离级别是 repeatable read (后文中用简称RR),它为了解决该隔离级别下的幻读的并发问题,提出了 LBCC 和 MVCC 两种方案。其中 LBCC 解决的是当前读情况下的幻读, MVCC 解决的是普通读(快照读)的幻读。至于什么是当前读,什么是快照读

    2024年02月10日
    浏览(39)
  • 关于TDSQL(MySQL)的简单知识分享

    最近在系统改造过程中,接触到了国产分布式数据库TDSQL,记录一下关于TDSQL的部分知识点。 TDSQL是腾讯推出的一款兼容MySQL的自主可控、高一致性分布式数据库产品。 1.1 TDSQL优点: 数据强一致性 高性能低成本 线性水平扩展 金融级高可用 企业级安全性 便捷的运维 1.2 TDSQL系

    2024年04月16日
    浏览(17)
  • 持续积累分享金融知识

    两融余额是指投资者在融资买入和融券卖出交易中,通过向券商借入资金或证券进行交易,并且在交易结算后未归还的资金或证券的余额。融资买入是指投资者以自己的资金和借来的资金合并进行证券买入的交易方式,而融券卖出是指投资者借入证券并卖出,待价格下跌后再

    2024年02月22日
    浏览(30)
  • 相机学习的知识积累

    六个问题理解ISP全流程_哔哩哔哩_bilibili ISP (Image Signal Processing) - NPTEL公开课_哔哩哔哩_bilibili ISP Pipline_isp pipeline-CSDN博客 摄像头camera基础知识_哔哩哔哩_bilibili ISP Pipline_isp pipeline-CSDN博客 10分钟理解相机ISP(图像信号处理)整体流程_英伟达摄像头isp tuning后的图像数据-CSDN博客

    2024年03月16日
    浏览(39)
  • 知识积累(1)

    (1) 当您在Git中看到消息 \\\"HEAD is now at 1343ccb FAB-17419 Fix off_chain_data sample error (#146)\\\" 时,这是Git告知您当前所在的分支和最新的提交哈希。 这条消息通常出现在使用Git命令后,如`git pull`或`git checkout`等操作后,Git会显示当前所在分支的最新提交哈希值。 在这个特定的示例中,

    2024年02月06日
    浏览(32)
  • 字体反爬积累知识

    目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术,它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字体图标

    2024年04月17日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包