今天在业务测试时,出现了数据脏读。第一次接触到这个问题,今天就简单的记录下吧
首先解释一下脏读、幻读、不可重复读出现的原因
脏读:一个事务读取到另一个事务尚未提交的数据
案例:假如张三和李四现在各有1000块钱,现在张三要给李四转500.但是现在张三并未提交事务。
然后李四现在查看账户发现现在是有1500块
加入张三准备提交事务时突然因断电发生异常回滚了事务,该转账操作实际并未完成,那么张三看到的1500块就是脏数据、
不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同
案例:假如到工资发放日期了,张三和他的女朋友同事去查看银行卡余额。假如张三第一次查到余额为1000,操作没有完成,事务还没提交。这时她的女朋友取出了500块,并提交了事务。张三再次去查余额时就变成了500。两次读取的结果不一致,导致了不可重复读。
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现幻觉。
案例:假如张三希望下午办一张中国银行的储蓄卡放在钱包里,中午他的女友去中国银行办了卡并把卡偷偷放到张三的钱包里面,等到下午张三准备去办理的时候发现他的钱包竟然有中国银行的储蓄卡,这就像产生幻觉一样。
解决以上的问题就要用到事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
序列化读 | × | × | × |
查看事务隔离级别
select @@transaction_isolation;
设置事务隔离级别
SET [SESSION|global] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED |REPEATABLE READ | SERIALIZABLE}
注意:事务隔离级别越高,数据越安全,但是性能越低。