- 什么是脏读?
脏读就是指当一个事务T1正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务T2也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。
- 下面我们看一下例子帮助大家理解上面的文字理论:
【解释】
- 小明和小丽夫妻两个人,到周末了,小丽约上自己的闺蜜去逛街,在商店,看到了一款自己特别喜欢的挎包,但是没有带够钱,那么小丽就去银行查询了一下银行卡里的账户,卡里还有500块钱,然后她取出来了200块钱。
- 但就在小丽取出这200块钱的同时,小明也打算去取一些钱然后与他多年不见的好兄弟去喝酒,查询账户的时候,发现银行卡里有300块钱(因为小丽刚刚操作了取200元)。
- 小丽是一个比较犹豫的人,她觉得这200块钱去买挎包太奢侈了,毕竟自己和小明刚毕业,需要花钱的地方很多,所以她后悔了,并没有真正的去取这200块钱(没有把这个操作的事务提交,而是操作了撤销操作)。
- 我们此时再看小明,因为查询银行卡里有300块钱,他也犹豫了,算了,不喝酒去了,等月底发工资再聚聚吧,然后把兜里的50块钱“私房钱”存到了账户,那么账户金额就变成了350块钱。并且点击了确认操作按钮。(即:提交了事务)
- 那么问题就出现了,小丽明明没有取钱,小明也把自己攒了多年的50块钱“私房钱”存到账户里了。但是总的金额并不是550块钱,而是350块钱。这就违反了ACID原则里面的原子性(A),C(一致性)和I(隔离性)了。
- 总结: 发生脏读的原因,其实就是小丽取出200块钱的时候,在小丽的事务范围内,总账户确实是500-200=300,明明还没有提交事务,但是却影响到了小明这个事务(即:小明查询出总账户已经是300了)。那么,解决办法就是,只有小丽事务提交,才能看到账户是300,如果她不提交事务,小明查询出来的账户就应该还是500。