不同事务同时进行读写操作时,有可能出现以下情况:
脏写,脏读,不可重复读,幻读
它们之间对读写操作结果的影响性由高到低。
1,脏写,就是指——开启事务后对某一张表写入数据并成功提交后,最终的数据却并没有真正存进表里的现象。好像这数据白写了一样,此之为“脏写”。
情景例子:
假设有2个事务A和B在某一时刻(暂且称呼为0点)一起开启了,它们即将要对某一张表(暂时假定为银行账号)进行扣款写操作。
0点时,账号存款是100块。两个事务已经一起开启,事务A想扣除50块,事务B想扣除70块,(因为存款是100,它们的操作都是合法的)。
但是因为某些原因事务B延迟了,事务A首先扣除了50块,然后事务A提交了,账号的存款余额为50块,事务A所在的线程继续做扣款后的后续作业,但此时事务B未进行。
紧接着,事务B终于开始对该账号扣除70块钱操作了,但此时存款余额已经不足以扣除70块,导致了事务回滚。存款余额回到0点,变回100块。
但刚刚的事务A已经提交了,也成功了,它可能因为提交成功已经得到授权做另外一些事情了。这就造成事务A成功扣除了(实际未被扣除的)50块。
这就是脏写,即写了白写。
2,脏读,就是读了不存在的数据,此之为“脏读”。
情景例子:
还是上面的例子,0点时,账号存款是100块。假设事务A要检查这个账号的主人是否百万富翁。而事务B则是有人向这个账号汇款了100万。
但是因为某些原因,这次事务A延迟了,事务B先执行,此时账号存款为100万零100,但事务B还没提交。
然后紧接着,事务A终于开始查询该账号存款余额,发现是100万零100,确实是百万富翁后,提交了事务,然后事务A就接着做后续作业了。
此时,事务B发现汇错款了,要回滚事务,存款余额回到0点,变回100块。
但刚刚的事务A已经提交了,已经确认了(实际并不是)百万富翁的账号。
这就是脏读,读了不存在的数据。
未完待续。