• 一篇文章搞懂MYSQL的脏读、不可重复读、幻读出现的原因以及用事务隔离级别来解决问题详解


    今天在业务测试时,出现了数据脏读。第一次接触到这个问题,今天就简单的记录下吧

    首先解释一下脏读、幻读、不可重复读出现的原因

    脏读:一个事务读取到另一个事务尚未提交的数据

    案例:假如张三和李四现在各有1000块钱,现在张三要给李四转500.但是现在张三并未提交事务。

    然后李四现在查看账户发现现在是有1500块

    加入张三准备提交事务时突然因断电发生异常回滚了事务,该转账操作实际并未完成,那么张三看到的1500块就是脏数据、

    不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同

    案例:假如到工资发放日期了,张三和他的女朋友同事去查看银行卡余额。假如张三第一次查到余额为1000,操作没有完成,事务还没提交。这时她的女朋友取出了500块,并提交了事务。张三再次去查余额时就变成了500。两次读取的结果不一致,导致了不可重复读。

    幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现幻觉。

    案例:假如张三希望下午办一张中国银行的储蓄卡放在钱包里,中午他的女友去中国银行办了卡并把卡偷偷放到张三的钱包里面,等到下午张三准备去办理的时候发现他的钱包竟然有中国银行的储蓄卡,这就像产生幻觉一样。

    解决以上的问题就要用到事务隔离级别

    事务隔离级别
    隔离级别脏读不可重复读幻读
    读未提交
    读已提交×
    可重复读××
    序列化读×××

     

    查看事务隔离级别

    select @@transaction_isolation;

    设置事务隔离级别

    SET [SESSION|global] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED |REPEATABLE READ | SERIALIZABLE}

    注意:事务隔离级别越高,数据越安全,但是性能越低。

  • 相关阅读:
    在构建Docker镜像时报错: Unable to locate package libcudnn7
    React报错之React hook ‘useState‘ cannot be called in a class component
    Python 的安装
    javascript和C++交互大全(wasm)emscripten
    嵌入式裸板开发
    DSP开发环境及工具之CCS
    外汇天眼:亏亏亏,为什么亏损的总是我?大数据分析报告告诉你答案
    java毕业设计在线毕设选题系统Mybatis+系统+数据库+调试部署
    unittest框架
    日志(三)
  • 原文地址:https://blog.csdn.net/xiaoheihai666/article/details/127782268