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

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

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

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

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

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

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

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

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

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

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

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

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

 

查看事务隔离级别

select @@transaction_isolation;

设置事务隔离级别

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值