写点什么

事务对系统影响(一)

用户头像
卢卡多多
关注
发布于: 刚刚
事务对系统影响(一)

事务,我们通常都听到这个词语,一般是用于系统的中一组逻辑操作开始的,这组逻辑操作要求是原子性的,比如转账功能,我必须要转账成功,需要两个条件,


本质上: 转账成功,


  • 操作一: 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. 幻读--> 在特定条件下,读取之前已经读取过的数据,但是发现有新的符合条件的数据(存在新数据),导致数据不一致。 串行化解决
复制代码

卢卡寄语:

今天是对于数据库事务展示 并发数据带来的问题, 以及解决方式, 下期我们讲关于事务隔离级别细节的解读。

发布于: 刚刚阅读数: 2
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习

评论

发布
暂无评论
事务对系统影响(一)