什么是事务?
事务(Transaction)是关系型数据库中,由一组 SQL 组成的一个执行单元,该单元要么整体执行成功,要么整体执行失败。
如下所示:
什么是事务的 ACID 特性
事务的 4 大特性:原子性(A),一致性(C),隔离性(I),持久性(D)。这 4 大特性统称为事务 ACID 特性。
原子性:指事务包含的所有操作SQL,要么都执行成功,要么都执行失败。

一致性:指事务前后数据的完整性必须保持一致。
以小张和小李转账为例:

隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性:指一个事务一旦被提交,那么数据就永久的存储在系统磁盘中,即使系统发生故障,数据仍然不会丢失。
事务之间没有隔离会出现什么糟糕的情况
1. 第一个严重问题:脏读
指一个事务处理过程中读取了另一个未提交(即回滚)的事务的数据。

如何解决脏读呢?
1)如果AB这2个动作是操作的同一个数据库,那么可以把AB的动作放在同一个事务中,C就不会出现脏读。
2)如果AB操作的是不同的数据库,即所谓的微服务架构中多服务对应多个业务库,那只能引入分布式事务来解决。
2. 第二个严重问题:不可重复读
指多次查询却返回了不同的数据值,这是由于查询隔离原因,被另一个事务修改并提交了。
如何解决不可重复读呢?
在数据库读取数据时加锁,类似 “select * from t_xxx where … for update” 这样的排它锁,明确数据读取后是为了更新操作,所以加了一把行级锁,防止别人修改这些数据。脏读 和 不可重复读 区别在哪?
1)脏读:读到的数据是前一个事务未提交的数据。
2)不可重复读:读到的是前一个事务已提交的数据。
3. 第三个严重问题:幻读
指当A事务在读取
某个范围内的数据时,B事务又在该范围内新插入了数据记录,此时A事务再次读取该范围内的数据时,就会产生幻读。
幻读 和 不可重复读 区别在哪?
1)相同点:幻读和不可重复读都是读取了另一个事务已提交的数据。
2)不同点:幻读是针对一批数据。不可重复读是针对的同一条数据。
讲完了事务是什么、事务的 4 大特性以及事务隔离性带来了哪些问题,接下来我们继续从事务的实际应用入手。
在传统的单体应用和当下流行微服务架构中,本地事务能解决的问题越来越少,大多互联网企业级系统都是微服务架构的,即多个服务对应多个业务库,所以引入分布式事务是必然的结果。
本地事务详解
本地事务是指只操作了一个数据库(单体应用较多)。
在 Spring 应用中的数据库事务管理,只要给方法加一个 @Transactional的注解就可以搞定,是不是超赞
















