事务对系统影响(一)
事务,我们通常都听到这个词语,一般是用于系统的中一组逻辑操作开始的,这组逻辑操作要求是原子性的,比如转账功能,我必须要转账成功,需要两个条件,
本质上: 转账成功,
操作一: A 账户向 B 账户,转账 100 元
操作二: B 账户增加 100 元,同时 A 账户少 100 元;
事务:
逻辑操作中,一组逻辑共同的操作,或者单个逻辑单元执行的一系列操作,共同是为了某一个目标而执行的原子性操作;
其实对于事务,我们已经不是很陌生了,基本的属性 ACID ,原子,一致,隔离,持久,这也是一般博客中都能提到的东西,但是具体我们来对比一下;
这些到底是用作干什么的;
这里我们换个视角去了解一下对于 MYSQL 的事务,是的,你没有听错,就是 MySQL 的事务;
MYSQL 事务的信息
对于数据库,我们基本是对于很多操作,类型基本分为读和写的操作,根据对于具体数据类型以及关系表的操作,我们可以解决很多复杂的问题,比如数据状态的更新,类型转化,添加数据等操作。
但是当数据库同时对于相同时间并发的处理执行多个事务的时候,就会导出很多意想不到的问题,
当前这些会在事务并发的时候,数据会经常性的遇到这些问题;
1.数据丢失
数据丢失,其实也比较好理解,因为事务具体隔离性,所以每个事务在操作的时候,并不被对方所知晓, 设想一个场景,如果是 事务 A,和事务 B 同时都有给 C 转钱, 依次是 100 元和 200 元,但是事务 C 账户是 100 元,
如果能转帐成功,并且事务都可以运行成功,那就账户 C 就会有 400 元, 但其实只会有 300 元,
原因:
解决方法:
本质上是读写问题,要写之前,确定读的数据,保证不被任何事务修改,然后才进行写操作,因为都是写操作,所以进行串行化的方式,解决脏写的问题。
2.脏读
这个其实是很好理解的,就是 A 事务,读到了 B 事务未提交的数据,导致你以后更新数据之后,万一 A 事务将数据回滚了,就会导致数据读取的不准确,有很大的数据漏洞风险存在
解决方法:
3.不可重复读
如果你每次去读取特定条件的数据,但是发现得到的数据结果不一致,主要是数据被修改或者删除操作中会遇到,
这种我们举个例子,如果说我要去查询某个班级的最高分, 第一次是 100,第二次是 99 分,你会发现数据不一致,
同样的条件下,数据不一致,本质上就是读写顺序的问题,
解决方法: 先读后写, (可重复读取)
对于 MYSQL 事务来说,对于可重复读的隔离级别中,SQL 语句读到数据之后,会将数据进行加锁,使得其他事物无法删除和修改此数据,此时就可以实现了可重复读(保证每次读取的结果都一致,对结果进行加锁)
4.幻读
幻读其实还挺玄乎的,因为很多时候都会出现这个问题, 这个问题常见的是,
事务读取之前查询 SQL 的数据,发现其他事务插入满足当前事务条件的新数据,导致我感觉看错了,眼花了(幻读出现)本质上:读写问题,先读后写;
解决方法:
因为可重复读隔离级别,可以解决不可重复读取中,数据不一致被改变的问题,行锁
幻读,只能是串行化操作来解决,但是在解决这个问题之后带来了数据并发的大大折扣
疑惑要点:
为什么感觉幻读和不可重复读详细呢,他们的区别能细节说一下吗?
先说结论:
本质上:
卢卡寄语:
今天是对于数据库事务展示 并发数据带来的问题, 以及解决方式, 下期我们讲关于事务隔离级别细节的解读。
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/2d727604c77acd40824cdeeac】。文章转载请联系作者。
评论