- 什么是不可重复读
指在一个事务T1内,多次读同一数据。在这个事务T1还没有结束时,另外一个事务T2修改并提交了该同一数据。那么,事务T1两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
- 下面我们看一下例子帮助大家理解上面的文字理论:
【解释】
- 经过“脏读”事件的发生,小丽去银行找领导,银行把损失的200块钱补偿给了小丽。假设现在账户总金额还是500块钱。
- 小丽上次逛街看上的挎包她真的是太喜欢了,心里长草的滋味可是很难受的。她跟小明说了想买包的事儿。小明也支持她,毕竟她现在的挎包还是大一时候买的,都破旧不堪了。然后,赶在第二个周末,小丽又约上了她的好姐妹去买包,这次她来到银行,查询账户余额是500块钱,她很开心,钱没有少。
- 此时,小明看小丽去逛街了,自己还是找朋友喝酒去吧,他也去了银行,查询余额是500块钱。
- 我们再把视角转到小丽,小丽取了200块钱,并且点击了确认按钮,高高兴兴的带着200块钱和闺蜜去买挎包了。
- 而小明呢,他也开始犹豫了,他知道小丽要去买包,自己要是再取钱,那岂不是账户里的钱就更少了。他自己又打“退堂鼓”了,算了!不喝酒了。省钱!然后他又查询了一下账户,此时发现,账户余额已经变成了300了。他一下子就慌了,哎?我没取钱啊,怎么钱从500变成了300了呢?也就是说,重复读取账户的时候,账户余额变化了。这就是不可重复读。
- 总结 不可重复读发生的核心就是在于小明的整个事务中,可以读到小丽提交了的事务所改变的数据。这种情况,在READ REPEATEABLE事务隔离级别是可以控制住的。怎么控制的呢?可以参见——面试题60:请概述一下,什么是MVCC?那版本链呢?ReadView又有什么用?