当前位置: 首页 > news >正文

MySQL 锁合集与事务隔离级别

概览

在数据库管理中,锁是用来控制多个事务对同一数据的并发访问的机制。InnoDB作为MySQL的默认事务型存储引擎,提供了多种类型的锁来保障事务的隔离性并减少冲突,从而维护数据库的完整性和一致性。以下是InnoDB提供的主要锁类型:

  1. 共享锁(S 锁)
    共享锁允许一个或多个事务读取同一数据行,并阻止其他事务在此数据行上获取排他锁。这种锁是协作型的,使得多个读操作可以不受干扰地同时发生。

  2. 排他锁(X 锁)
    排他锁是比共享锁更严格的锁,当事务持有排他锁时,它可以对数据行进行更新操作。其他事务不能读取或写入这个已被排他锁保护的数据行,直到锁被释放。

  3. 意向共享锁(IS 锁)
    意向锁是InnoDB用来表明事务意图在表的某些行上设置共享锁的方式。当事务打算在表中的多行上设置共享锁时,它首先会在表级别上设置意向共享锁。

  4. 意向排他锁(IX 锁)
    类似意向共享锁,意向排他锁表明事务打算在表的一行或多行上设置排他锁。它是一个表级锁,允许事务显示其对数据行的未来排它锁定的意图。

  5. 记录锁
    记录锁是最精细级别的锁,它直接作用于表中的单个记录。这种锁类型用于控制对具体一行数据的读写操作,通常与其他锁类型结合使用,以实现更高的并发性。

  6. 间隙锁
    间隙锁用于锁定一组记录的间隙,也就是两个索引记录之间的范围。这种锁防止其他事务在间隙范围内插入新行,是InnoDB间隙锁定策略的一部分。

  7. Next-Key锁
    Next-Key锁结合了记录锁和间隙锁的特性,锁定一个索引记录以及该记录前的间隙。这种锁是InnoDB中默认的锁类型,旨在防止幻读现象。

  8. 插入意向锁
    当事务准备插入新行时,它会先设置插入意向锁。这个锁与其它事务的插入意向锁是兼容的,但与在相同位置的其他类型锁冲突,用于在插入时维持间隙锁的正确性。

  9. AUTO-INC锁
    AUTO-INC锁是一种特殊类型的锁,在事务插入新值到带有AUTO_INCREMENT属性的列时使用。这个锁确保新生成的自动增长值的唯一性和连续性。

锁列表

  1. 共享锁(S 锁): 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁
  2. 排他锁(X 锁): 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁
  3. 意向共享锁(IS 锁): 表明一个事务打算在表中的行上设置 S 锁
  4. 意向排他锁(IX 锁): 表明一个事务打算在表中的行上设置 X 锁
  5. 记录锁: 用于锁定表中的行
  6. 间隙锁: 用于锁定表中的一个“间隙”,用以防止并发的插入操作
  7. Next-Key锁: 锁定一个索引记录与该记录之前的“间隙”,即锁定的是该键值的前闭后开区间
  8. 插入意向锁: 当InnoDB插入一行时,它会先在被插入的位置设置一个插入意向锁,这意味着这个事务打算插入一行
  9. AUTO-INC锁: 在插入AUTO_INCREMENT列的新值时使用

事务隔离级别和锁关系

事务隔离级别使用的锁类型不使用的锁类型脏读幻读不可重复读原因
读未提交 (Read Uncommitted)排他锁(X锁)共享锁(S锁), 间隙锁, Next-Key锁, 意向共享锁(IS锁), 意向排他锁(IX锁)高并发,最低级别的数据隔离,直接读取数据库中无论是否提交的数据。
读提交 (Read Committed)排他锁(X锁), 记录锁间隙锁, Next-Key锁防止脏读,只能读取提交后的数据,但事务内部的多次读取可能见到不同数据。
可重复读 (Repeatable Read)共享锁(S锁), 排他锁(X锁), Next-Key锁, 插入意向锁间隙锁(可选)默认级别,保证事务内可见数据的一致性,防止幻读和不可重复读。
可序列化 (Serializable)共享锁(S锁), 排他锁(X锁), 意向共享锁(IS锁), 意向排他锁(IX锁), 表级锁间隙锁(可能)最高级别的数据隔离,加锁防止所有事务并发,确保数据一致性。

解释:

  • 脏读:读取到其他未提交事务中的数据。
  • 幻读:在一个事务内读取时,因为其他并发事务的插入操作,一次查询和下一次查询的结果集不一致。
  • 不可重复读:在同一个事务内,多次读取同一数据集合时,因其他事务的修改操作导致后续读取的结果与起始读取不同。

总结

想象你一下,你使用Spring声明式事务@Transactional,然后在代码中各种使用Feign/RestTemplate/WebClient进行内部和外部调用,你想想你的数据库是什么感受。它就各种锁锁锁,然后业务就各种DeadLock,DeadLock。

http://www.lryc.cn/news/330217.html

相关文章:

  • 题解 -- 第六届蓝桥杯大赛软件赛决赛C/C++ 大学 C 组
  • Lua脚本的使用
  • hcia datacom课程学习(5):MAC地址与arp协议
  • unbuntu mysql8.0新建用户及开启远程连接
  • Intel FPGA (1):线性序列机
  • 翻译: 硅谷软件工程师面试:准备所需的一切
  • 视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决
  • kubuntu23.10安装sdl2及附加库和 sfml2.5.1
  • Centos JDK1.8 下载安装
  • iOS开发进阶(十四):xcodebuild 命令应用详解
  • uniapp 开发之原生Android插件
  • 构建第一个JS应用(FA模型)
  • 物联网学习2、MQTT 发布/订阅模式介绍
  • docker--部署 (超详版) (五)
  • 谷粒商城——通过接口幂等性防止重复提交订单
  • 谈谈MVCC机制
  • Linux之用户账号、用户组和与账号有关的系统文件
  • mac 安装 pip,如果你的电脑已经有 python3
  • java 枚举
  • Java学习之类和对象、内存底层
  • 递归遍历目录结构和树状展现
  • 【C++的奇迹之旅(二)】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例
  • 如何通过针对iOS的动态分析技术绕过反调试机制
  • 33.Python从入门到精通—Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别
  • 便携式气象站是什么
  • AIGC重塑金融:AI大模型驱动的金融变革与实践
  • TP4054替代DP4054锂电池供电电路保护方案
  • 前端JS商品规格组合
  • ⾃定义类型:联合和枚举
  • Spring IOC控制反转、DI注入以及配置