• 什么是脏读、不可重复读、幻读讲解


    数据库隔离级别是数据库管理系统中一个重要的概念,它定义了事务之间的可见性和影响。在多用户并发访问数据库时,隔离级别能够确保事务之间的相互独立性,避免数据不一致的问题。本文将深入探讨三种常见的并发问题:脏读、不可重复读和幻读。

    一、脏读(Dirty Read):

    脏读是指一个事务在读取另一个事务修改但尚未提交的数据时发生。当事务A读取了事务B尚未提交的数据,如果事务B最终回滚,那么事务A读取到的数据就是“脏”的。
    在这里插入图片描述脏读最大的问题就是可能会读到不存在的数据。比如在上图中,事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中。

    从宏观来看,就是事务A读出了一条不存在的数据,这个问题是很严重的。

    实例:

    考虑两个事务A和B:

    事务A读取数据X的值;
    事务B修改数据X的值;
    事务A再次读取数据X的值;
    事务B回滚。
    在这种情况下,事务A读取到的数据X是脏数据,因为事务B的修改最终未提交。

    解决方案

    使用数据库的隔离级别,如Read Committed或Serializable,可以避免脏读的发生。这样,一个事务只能读取已经提交的数据,而不是未提交的数据。

    二、不可重复读(Non-Repeatable Read):

    不可重复读是指在一个事务内,两次读取同一数据,但得到的结果却不一样。这是因为在两次读取之间,另一个事务修改了数据并提交了。
    在这里插入图片描述
    比如上图,事务 A 两次读取同一数据,第一次读取结果为 1,当事务 B 修改了数据并提交,此时的事务 A 第二次读取结果为 2,两次读取结果不一致!

    当数据库的事务隔离级别为读未提交、读提交时,就会发生不可重复读现象!

    实例

    考虑两个事务A和B:

    事务A读取数据X的值;
    事务B修改数据X的值,并提交;
    事务A再次读取数据X的值。
    在这种情况下,事务A两次读取到的数据X的值不一样,因为在读取之间发生了数据修改。

    解决方案

    提高隔离级别,如Serializable,可以避免不可重复读。在Serializable隔离级别下,事务A在读取数据X的同时,事务B不能对数据X进行修改,从而确保了事务A的两次读取结果一致。

    三、幻读(Phantom Read)

    幻读是指在一个事务内,两次查询得到的结果集不一样,这是因为在两次查询之间,另一个事务插入(或删除)了数据并提交了。

    例如事务 A 对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。此时,突然事务 B 插入了一条数据并提交了,当事务 A 提交了修改数据操作之后,再次读取全部数据,结果发现还有一条数据未更新,给人感觉好像产生了幻觉一样。这就是幻读!
    在这里插入图片描述当有别的事务,在插入或者删除同一条数据的时候,就容易产生幻读的现象!

    当数据库的事务隔离级别为读未提交、读提交、可重复读时,就会发生幻读现象!

    实例

    考虑两个事务A和B:

    事务A查询满足条件的数据集;
    事务B插入新的符合条件的数据,并提交;
    事务A再次查询相同条件的数据集。
    在这种情况下,事务A两次查询的结果集不一样,因为在查询之间发生了数据的插入。

    解决方案

    Serializable隔离级别可以避免幻读。在Serializable隔离级别下,事务A在查询数据集的同时,事务B不能插入或删除符合条件的数据,从而确保了事务A的两次查询结果一致。

    总结

    脏读、不可重复读和幻读是并发访问数据库时常见的问题,可以通过合适的隔离级别来解决。不同的隔离级别在事务的可见性和影响上有所不同,开发人员需要根据应用的需求选择适当的隔离级别,以确保数据的一致性和正确性。

    通过深入理解脏读、不可重复读和幻读,开发人员可以更好地设计和管理数据库事务,提高系统的并发性能和数据一致性。
    在这里插入图片描述

  • 相关阅读:
    关于序列化协议,你需要知道的一些内容(3)
    【初阶数据结构】——堆排序和TopK问题
    真的?听声音就能识别新冠患者?DeepMind海龟面部识别AI实践;数据建模与数据库·最新课程;推荐系统快速实现框架;前沿论文 | ShowMeAI资讯日报
    Go-Admin后台管理系统源码(GO+VUE)编译与部署
    微信小程序 基础 知识点汇总 总结
    【面经】特斯拉大数据开发面经
    如何mock java类中的static方法
    配置自动化部署Jenkins和Gitea
    ROM修改进阶教程------如何去除安卓机型系统的开机向导 几种操作步骤解析
    linux无网环境实现nginx免安装
  • 原文地址:https://blog.csdn.net/wangxuanyang_zer/article/details/134449923