Spring Boot 中的事务传播级别
Spring Boot 中的事务传播机制用于处理多个事务方法之间相互调用时的事务行为,确保数据的一致性和完整性。Spring Boot 使用 @Transactional
注解来管理事务,并提供了多种事务传播行为。以下是 Spring Boot 中常用的事务传播行为及其解释:
1. PROPAGATION_REQUIRED
说明:这是默认的事务传播级别。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
行为:
如果外部方法已经在一个事务中,内部方法将加入该事务。
如果外部方法不在事务中,内部方法将启动一个新的事务。
外部事务提交,内部事务才会提交。
内部或外部方法抛出异常,事务会一起回滚。
2. PROPAGATION_REQUIRES_NEW
说明:始终创建一个新的事务,无论当前是否存在事务。如果当前存在事务,将挂起当前事务。
行为:
内部方法总是启动一个新的事务。
外部方法的事务被挂起,直到内部方法的事务完成。
内部事务提交或回滚不影响外部事务。
内部方法抛出异常,外部方法可以选择捕获异常继续执行或回滚整个事务。
3. PROPAGATION_SUPPORTS
说明:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
行为:
如果外部方法已经在一个事务中,内部方法将加入该事务。
如果外部方法不在事务中,内部方法将以非事务方式执行。
4. PROPAGATION_NOT_SUPPORTED
说明:以非事务方式执行,如果当前存在事务,则挂起当前事务。
行为:
内部方法总是以非事务方式执行。
如果外部方法有一个事务,该事务将被挂起,直到内部方法完成。
5. PROPAGATION_NEVER
说明:以非事务方式执行,如果当前存在事务,则抛出异常。
行为:
内部方法总是以非事务方式执行。
如果外部方法有一个事务,将抛出
IllegalTransactionStateException
异常。
6. PROPAGATION_MANDATORY
说明:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
行为:
内部方法必须在一个事务中执行。
如果外部方法没有事务,将抛出
IllegalTransactionStateException
异常。
7. PROPAGATION_NESTED
说明:如果当前存在事务,则创建一个嵌套事务;如果当前没有事务,则创建一个新的事务。
行为:
内部方法创建一个嵌套事务,该事务是外部事务的一个子事务。
外部事务提交,内部事务也会提交。
内部事务回滚,外部事务可以选择回滚或继续执行。
使用前提:JDK 版本需要在 1.4 以上,事务管理器的
nestedTransactionAllowed
属性为true
,并且外部方法需要捕获内部方法抛出的异常。