前言

感谢阿甘老师的教学视频,让我可以比较透彻,清晰的接收这些知识,博客内容大多来自于老师的教学内容,我只是将其中的内容整理了一下

什么是事务?

第一章 本地事务
事务(Transaction)是关系型数据库中,由一组SQL组成的一个执行单元,该单元要么整体成功,要么整体失败。

事务的ACID特性

事务ACID特性,原子性,一致性,隔离性,持久性。这4个属性统称为ACID特性。
第一章 本地事务
原子性:指事务包含的所有操作sql要么整体成功,要么整体失败。
第一章 本地事务
第一章 本地事务
持久性:指一个事务一旦被提交了,那么数据就永久存储在磁盘中,即使系统故障了,数据也不会丢失!

第一章 本地事务

如果事务没有进行隔离,会出现3种严重的问题:
第一个问题:赃读

指一个事务处理的过程中读取了另一个未提交(回滚)的事务的数据。

第一章 本地事务
第一个动作:A给B转100元
第二个动作:B提交了事务,余额多加了100元,但是呢A没提交事务
第三个动作:当B提交了,A没提交,这个时候C来读B的余额,C读到了已经加100元的余额。
第四个动作:如果出现了网络问题,A回滚,就会导致B也眼着回滚,没问题来了?C读到的数据就是脏数据, 简称为赃读!
如何解决赃读?
1.如果AB这2个动作是操作同一个数据库,那么可以把AB的动作放在同一个事务里面,C就不会出现赃读。
2.如果不是同一个数据库,而是AB不同数据库,或微服务操作,那就只能采用分布式事务来解决。

第二个问题:不可重复读

指多次查询却返回了不同的数据值,这是由于查询间隔原因,被另一个事务修改并提交了。

第一章 本地事务
如何解决不可重复读?
在数据读出来后加吧锁,类似 “select from xx for update”,明确数据读出来就是为了更新操作,所以加了一把锁,防止别人修改它。
赃读和不可重复读有什么区别?
赃读:读到的数据是前一个事务未提交的数据。
宋可重复读:读到的数据是前一个事务已提交的数据。

第三个问题:幻读

指当A事务在读取某个范围内的记录时,B事务又在该范围内插入了新的记录, 当A事务再次读取该范围内的记录时,就产生了幻读。
第一章 本地事务
幻读和不可重复读有什么区别?
相同点:幻读和不可重复读都是读到了另一个事务已经提交的数据(赃读是未提交)
不同点: 不可重复读:读到的都是同一个数据值(同一条数据)。
幻读: 是针对一批整体的数据(数据的总数或一张表)。

相关文章: