一、简介
1、什么是事务
事务是指一组操作,这些操作要么全部成功执行,要么全部不执行,保证数据的完整性和一致性。事务广泛应用于数据库管理系统、分布式系统和企业级应用中;
2、事务的特性
事务具有四个基本特性,通常被称为ACID特性:
- 原子性(Atomicity) - 事务中的所有操作要么全部完成,要么全部失败回滚,不存在部分完成的情况;
- 一致性 (Consistency) - 事务必须使数据库从一个一致性状态转换到另一个一致性状态;
- 隔离性(Isolation) - 多个事务并发执行时,一个事务不应该被其他事务干扰;
- 持久性 (Durability) - 一旦事务提交,其所做的修改将永久保存在数据库中;
3、事务的传播性
事务的传播一般发生在事务的嵌套中,常见的事务传播属性包括:
- REQUIRED: 如果当前存在事务,则加入该事务;如果没有,则创建一个新的。
- REQUIRES_NEW: 总是创建一个新的事务,如果当前存在事务,则将其挂起。
- SUPPORTS: 如果当前存在事务,则加入该事务;如果没有,则以非事务方式执行。
- MANDATORY: 必须在一个事务中执行,如果没有,则抛出异常。
- NOT_SUPPORTED: 总是以非事务方式执行,如果当前存在事务,则将其挂起。
- NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED: 如果当前存在事务,则开启一个嵌套事务。
那么有聪明的小伙伴就要问了:REQUIRED中,如果没有事务,则新建一个,这里的外层事务,还算是事务吗?
答:在事务传播属性 REQUIRED 的上下文中,“外层事务” 通常指的是当前方法执行时已经存在的事务环境。如果没有事务存在,使用 REQUIRED 的方法会启动一个新的事务,此时这个新启动的事务自然成为外层事务。
举个简单的例子:
假设有两个方法,methodA 和 methodB,两个方法都配置为使用 REQUIRED。
1. 当 methodA 被调用时,如果没有其他事务在进行中,methodA 会启动一个新的事务。这时,这个事务就是外层事务。
2. 如果 methodA 在执行过程中调用了 methodB,由于 REQUIRED 的传播属性,methodB 不会创建新的事务,而是加入 methodA 已经启动的事务。
因此,在 REQUIRED 场景中,当没有现有事务时,创建的新事务确实是一个标准的事务(即 “外层事务”),它管理在其控制范围内的所有数据库操作,直到提交或回滚。