• 二十六、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】将事务的隔离级别设置为串读,其余再如上执行即可。

     

  • 相关阅读:
    Vue3学习(十七) - 点击二级分类实现自动筛选功能
    Matlab如何选择读取dat格式数据?
    基于RFID技术的智能书架系统
    数字货币的一些隐私保护问题
    【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本
    Java Class.forName()具有什么功能呢?
    JS Mock开发
    Python数据分析与机器学习39-Xgboost算法实例
    解析Vue3源码(二)——ref
    责任链模式
  • 原文地址:https://blog.csdn.net/2301_79149013/article/details/133322317