• 二十六、MySQL并发事务问题:脏读/不可重复读/幻读


    1、事务的隔离级别

    (1)隔离级别

    Read uncommitted # 读,未提交

    Read committed # 读,已提交

    Repeatable Read(默认) # 可重复读

    Serializable # 串读

    (2)基础语法

    set transaction isolation level 事务的隔离级别

     2、脏读

    (1)脏读演示

    ·【1】将事务的隔离级别设置为“读,未提交”;

    ·【2】开启两个独立的事务;

    ·【3】在左边事务中,显示account表的所有数据;

    ·【4】在右边事务中,修改account表中数据(jom的money数据),此时右边表中的数据改动未提交

    ·【5】在左边事务中,再次显示account表中所有数据,可以看到,account表中数据出现变动,这是因为左边事务受到了右边事务的影响,导致数据出现了错误。

    (2)避免脏读

            【1】将事务的隔离程度设置为“读,已提交”,再按照上述顺序执行【2】、【3】、【4】、【5】、【6】即可,发现并未出现脏读变化

     3、不可重复读

    (1)不可重复读演示

    ·【1】将事务的隔离程度设置为“读,已提交”,开启左右两个事务;

    ·【2】左边事务查看account表中所有数据;

    ·【3】右边事务修改表中数据;

    ·【4】再次调用select,左边事务查看account表中所有数据;

    ·【5】提交右边事务数据;

    ·【6】再次调用select,左边事务查看account表中所有数据,发现两次account表中数据显示不一致

    (2) 避免不可重复读

    ·【1】将左边事务隔离程度设置为“可重复读”,左右开启事务;

    ·【2】左边事务调用select语句,显示account表中所有数据;

    ·【3】右边事务修改account表中数据;

    ·【4】提交右边事务;

    ·【5】左边事务调用select语句,再次显示account表中所有数据,发现数据并未发生改变

    4、幻读

    (1)幻读演示

    ·【1】将事务的隔离级别设置为“可重复读”;

    ·【2】左右两边开启事务;

    ·【3】左边事务调用select函数,查看account表中id=3的行数据,发现account中并不存在id=3的行数据;

    ·【4】右边事务调用insert函数,给account表中田间id=3的行数据;

    ·【5】左边事务再次调用insert函数,给account添加id=3的行数据,MySQL会提示错误“id=3已被占用”;

    ·【6】在左边事务调用select函数,查看id=3的行数据,发现id=3的行数据并不存在

    (2) 避免幻读

            【1】将事务的隔离级别设置为串读,其余再如上执行即可。

     

  • 相关阅读:
    2023/10/23学习记录
    Google Earth Engine(GEE)—— Landsat7和8的2000-2021年的影像土地分类的下载和视频导出
    JS逆向核心流程
    Entity Framework Core 7中高效地进行批量数据插入
    新来的员工,突然在我面前哭了
    【Proteus仿真】【51单片机】水箱液位监控系统
    Java学习笔记4.3.1 数学计算 - Math类
    首发丨全球首款用于激光雷达的商用光控超表面芯片发布!激光雷达降本再添可选项
    网工内推 | 信息安全主管,CISP认证优先,最高25K,加绩效提成
    RepVGG 核心讲解
  • 原文地址:https://blog.csdn.net/2301_79149013/article/details/133322317