MYSQL事务有关的特性

Posted alvinleong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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事务有关的特性的主要内容,如果未能解决你的问题,请参考以下文章

mysql的事务四个特性以及事务的四个隔离级别

MySQL事务ACID特性

MySQL事务特性,隔离级别

深入学习MySQL事务:ACID特性的实现原理

Mysql --09 Innodb核心特性——事务

MySQL 8.0新特性