事务对系统影响(一)
事务,我们通常都听到这个词语,一般是用于系统的中一组逻辑操作开始的,这组逻辑操作要求是原子性的,比如转账功能,我必须要转账成功,需要两个条件,
本质上: 转账成功,
操作一: A账户向B账户,转账100元
操作二: B账户增加100元,同时A账户少100元;
事务:
逻辑操作中,一组逻辑共同的操作,或者单个逻辑单元执行的一系列操作,共同是为了某一个目标而执行的原子性操作;
其实对于事务,我们已经不是很陌生了,基本的属性ACID ,原子,一致,隔离,持久,这也是一般博客中都能提到的东西,但是具体我们来对比一下;
这些到底是用作干什么的;
这里我们换个视角去了解一下对于 MYSQL的事务,是的,你没有听错,就是MySQL的事务;
MYSQL事务的信息
对于数据库,我们基本是对于很多操作,类型基本分为读和写的操作,根据对于具体数据类型以及关系表的操作,我们可以解决很多复杂的问题,比如数据状态的更新,类型转化,添加数据等操作。
但是当数据库同时对于相同时间并发的处理执行多个事务的时候,就会导出很多意想不到的问题,

当前这些会在事务并发的时候,数据会经常性的遇到这些问题;
1.数据丢失
数据丢失,其实也比较好理解,因为事务具体隔离性,所以每个事务在操作的时候,并不被对方所知晓, 设想一个场景,如果是 事务A,和事务B同时都有给C转钱, 依次是100元和200元,但是事务C 账户是100元,
如果能转帐成功,并且事务都可以运行成功,那就账户C就会有400元, 但其实只会有300元,
原因:
因为A事务未完成的时候,事务B就读取到,C就100元,在这个基础上更新,就是最后的300元
解决方法:
本质上是读写问题,要写之前,确定读的数据,保证不被任何事务修改,然后才进行写操作,因为都是写操作,所以进行串行化的方式,解决脏写的问题。
2.脏读
这个其实是很好理解的,就是A事务,读到了B事务未提交的数据,导致你以后更新数据之后,万一A事务将数据回滚了,就会导致数据读取的不准确,有很大的数据漏洞风险存在
解决方法:
读已提交
3.不可重复读
如果你每次去读取特定条件的数据,但是发现得到的数据结果不一致,主要是数据被修改或者删除操作中会遇到,
这种我们举个例子,如果说我要去查询某个班级的最高分, 第一次是100,第二次是99分,你会发现数据不一致,
同样的条件下,数据不一致,本质上就是读写顺序的问题,
解决方法: 先读后写, (可重复读取)
对于MYSQL事务来说,对于可重复读的隔离级别中,SQL语句读到数据之后,会将数据进行加锁,使得其他事物无法删除和修改此数据,此时就可以实现了可重复读(保证每次读取的结果都一致,对结果进行加锁)
4.幻读
幻读其实还挺玄乎的,因为很多时候都会出现这个问题, 这个问题常见的是,
事务读取之前查询SQL的数据,发现其他事务插入满足当前事务条件的新数据,导致我感觉看错了,眼花了(幻读出现)本质上:读写问题,先读后写;
解决方法:
因为可重复读隔离级别,可以解决不可重复读取中,数据不一致被改变的问题,行锁
幻读,只能是串行化操作来解决,但是在解决这个问题之后带来了数据并发的大大折扣

疑惑要点:
为什么感觉幻读和不可重复读详细呢,他们的区别能细节说一下吗?
先说结论:
本质上:
相同点:
- 都是数据由于数据读写顺序,造成的数据读取前后不一致造成的
不同点:
- 1. 不可重复读-->因为特定条件下,读取的数据因为被其他事务修改或者删除,导致的数据不一致的情况(行锁)
- 2. 幻读--> 在特定条件下,读取之前已经读取过的数据,但是发现有新的符合条件的数据(存在新数据),导致数据不一致。
串行化解决
卢卡寄语:
今天是对于数据库事务展示 并发数据带来的问题, 以及解决方式, 下期我们讲关于事务隔离级别细节的解读。