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

MySQL的脏读、不可重复读、幻读与隔离级别

脏读/不可重复读/幻读

脏读

脏读(Dirty Read)发生在一个事务读取了另一个事务尚未提交的数据。如果第二个事务失败并回滚,第一个事务读到的数据就是错误的。这意味着数据从一开始就是不稳定或者“脏”的。

举例

  • 事务A读取了某条记录的值为X。
  • 事务B修改该记录的值为Y并暂时保存更改(尚未提交)。
  • 事务A再次读取同一记录,读到的值是Y。
  • 如果事务B失败并回滚,事务A读到的数据Y实际上是无效的。

不可重复读

不可重复读(Non-repeatable Read)是指在同一事务中,多次读取同一数据时,由于其他事务成功提交了更新操作,导致后续读取的数据与初次读取的结果不同。重点在于“数据在事务中的多次读取之间被其他事务修改”。

举例

  • 事务A读取某行数据,得到值X。
  • 事务B更新了该行数据的值为Y并提交。
  • 事务A再次读取同一行数据,这次读到的值是Y。

幻读

幻读(Phantom Read)更多地关注于一个事务在读取某个范围的数据时,另一个事务在这个范围内插入或删除记录,并提交,导致原事务在再次读取该范围的数据时看到不一致的行。

举例

  • 事务A查询某个条件下的记录,得到了10条数据。
  • 事务B在满足同样条件下插入了新的一条记录并提交。
  • 事务A再次查询相同的条件,这次查询到了11条记录。

三者区别

  • 脏读涉及到读取未提交数据。
  • 不可重复读涉及到一个事务在尚未完成前,其他事务修改并提交了它已读取的数据。
  • 幻读涉及到一个事务在尚未完成前,其他事务增加或删除了符合查询条件的记录。

隔离级别

不同的数据库隔离级别可以解决这些问题:

  • 读未提交(Read Uncommitted)允许脏读,但可以避免写锁。

  • 读提交(Read Committed)避免脏读,但不能防止不可重复读和幻读。

  • 可重复读(Repeatable Read)可以防止脏读和不可重复读,但可能无法防止所有的幻读。

    Next Key Lock是一种在数据库管理系统中使用的锁定机制,用于维护事务的隔离性,并防止幻读。这种锁定机制常见于使用InnoDB存储引擎的MySQL数据库中。Next Key Lock实质上是一种组合锁,它同时包含记录锁(row lock)和间隙锁(gap lock)。

    Next Key Lock的工作机制

    1. 记录锁:直接锁定数据库表中的单条记录,防止其他事务对这条记录进行修改。
    2. 间隙锁:锁定记录之间的间隙,或者是某条记录与索引中的下一条记录之间的空间。这可以防止其他事务在这些间隙中插入新的记录。

    组合这两种锁的机制,Next Key Lock能够锁定一个范围,包括起始记录和该记录之前的间隙。这样做的目的是为了防止其他事务在这个范围内进行插入、更新或删除操作,从而保证了事务的一致性和隔离性。

    Next Key Lock防止幻读

    幻读主要是指当一个事务在读取某个范围的记录时,另一个事务在这个范围内插入了新的记录,并提交。如果原事务再次查询这个范围,就会“看到”新插入的记录,即所谓的幻影记录。

    Next Key Lock通过锁定操作影响的数据范围及其间隙,可以有效地防止幻读现象。因为当使用Next Key Lock时,任何尝试插入新记录到已锁定间隙的事务都将被阻塞,直到原事务完成。这样一来,就保证了即使是范围查询也能读到一致的结果,避免了在事务执行期间出现幻读。

    使用场景和影响

    虽然Next Key Lock提供了较强的数据一致性保障,它在某些情况下会导致性能问题,特别是在高并发的环境下。因为Next Key Lock可能会锁定大量的数据范围,这可能会引起锁竞争,增加事务的等待时间和系统的负载。

    因此,使用Next Key Lock或任何其他类型的锁时,需要在数据一致性和系统性能之间做出适当的平衡。对于需要高度数据一致性的应用,使用Next Key Lock是合适的;而对于那些对性能要求极高的系统,可能需要考虑其他更轻量级的锁策略或不同的隔离级别。

  • 串行化(Serializable)是最高的隔离级别,可以防止脏读、不可重复读和幻读,但性能影响最大,因为它通过完全串行化事务执行来保证一致性。

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

相关文章:

  • 程序员前端开发者的AI绘画副业之路:在裁员危机中寻找新机遇
  • Burp Suite的使用和文件上传漏洞靶场试验
  • 如何在Ubuntu中安装deepin wine版的企业微信
  • 案例:Nginx + Tomcat集群(负载均衡 动静分离)
  • 【密码学】密码协议的分类:②认证协议
  • 异步编程(Promise详解)
  • DjangoORM注入分享
  • 【HBZ分享】Redis各种类型的数据结构应用场景
  • anaconda创建并且配置pytorch(完整版)
  • 高级java每日一道面试题-2024年8月10日-网络篇-你对跨域了解多少?
  • AtCoder Beginner Contest 365 A~E
  • 多机部署, 负载均衡-LoadBalance
  • (回溯) LeetCode 78. 子集
  • DQL数据查询语言(多表处理)—/—<7>
  • 力扣刷题总结
  • BLDC ESC 无刷直流电子调速器驱动方式
  • 解决 IntelliJ IDEA 编译错误 “Groovyc: Internal groovyc error: code 1” 及 JVM 内存配置问题
  • LeetCode.2940.找到Alice和Bob可以相遇的建筑
  • OFD板式文件创建JAVA工具-EASYOFD 四、文字 Text
  • 【概念速通】李群 lie group
  • day_39
  • 计算机系统层次结构
  • java语言特点
  • 单元测试注解:@ContextConfiguration
  • 大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
  • MySQl 中对数据表的增删改查(基础)
  • LVS知识点整理及实践
  • Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式
  • 计算机毕业设计选题推荐-办公用品管理系统-Java/Python项目实战
  • 计算机毕业设计选题推荐-网上考试系统-Java/Python项目实战