码迷,mamicode.com
首页 > 数据库 > 详细

MYSQL事务有关的特性

时间:2020-01-04 01:29:12      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:假设   影响   可重复   百万富翁   mda   操作   重复   mysql   回滚事务   

不同事务同时进行读写操作时,有可能出现以下情况:

脏写,脏读,不可重复读,幻读

 

它们之间对读写操作结果的影响性由高到低。

 

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已经提交了,已经确认了(实际并不是)百万富翁的账号。

这就是脏读,读了不存在的数据。

 

未完待续。

MYSQL事务有关的特性

标签:假设   影响   可重复   百万富翁   mda   操作   重复   mysql   回滚事务   

原文地址:https://www.cnblogs.com/alvinleung/p/12147615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!