摘要:本文将详细介绍 Spring 事务的传播机制,包括传播行为的概念、不同传播行为的使用方法以及具体的实例。通过深入了解 Spring 事务传播机制,开发者可以更好地控制事务的执行方式,满足不同业务场景的需求。
1. 事务传播行为的概念
事务传播行为(Transaction Propagation Behavior)描述了在一个方法中调用另一个方法时,事务如何传播。Spring 提供了 7 种不同的传播行为,分别为:REQUIRED(默认)、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER 和 NESTED。不同的传播行为决定了事务在嵌套调用时如何执行。
2. 不同传播行为的定义与使用方法
2.1 REQUIRED
REQUIRED 是默认的传播行为。如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。在大多数场景下,使用 REQUIRED 传播行为即可满足需求。
@Transactional(propagation = Propagation.REQUIRED)
public void someMethod() {
// ...
}
2.2 SUPPORTS
SUPPORTS 表示如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行。这种传播行为适用于不强制要求事务,但可以充分利用现有事务的场景。
@Transactional(propagation = Propagation.SUPPORTS)
public void someMethod() {
// ...
}
2.3 MANDATORY
MANDATORY 表示如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常。这种传播行为适用于必须在事务中执行的场景。
@Transactional(propagation = Propagation.MANDATORY)
public void someMethod() {
// ...
}
2.4 REQUIRES_NEW
REQUIRES_NEW 表示无论当前是否存在事务,都创建一个新的事务。如果当前存在事务,则将当前事务挂起,直到新事务完成。这种传播行为适用于需要独立于当前事务的场景。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void someMethod() {
// ...
}
2.5 NOT_SUPPORTED
NOT_SUPPORTED 表示以非事务方式执行,如果当前存在事务,则将事务挂起。这种传播行为适用于不需要事务支持的场景。
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void someMethod() {
// ...
}
2.6 NEVER
NEVER 表示必须以非事务方式执行,如果当前存在事务,则抛出异常。这种传播行为适用于不能在事务中执行的场景。
@Transactional(propagation = Propagation.NEVER)public void someMethod() {// ...}
2.7 NESTED
NESTED 表示如果当前存在事务,则以嵌套事务的方式执行;如果不存在事务,则创建一个新的事务。嵌套事务是一种特殊的事务,它可以独立于外部事务进行回滚,但提交时仍依赖于外部事务。这种传播行为适用于需要在单个事务内执行多个独立操作的场景。
@Transactional(propagation = Propagation.NESTED)
public void someMethod() {
// ...
}
3. 示例:不同传播行为的使用场景
假设有一个银行转账的业务场景,涉及到两个方法:transfer 和 audit。transfer 方法负责实际转账操作,audit 方法负责记录转账操作的审计日志。根据不同的需求,可以使用不同的事务传播行为:
- 使用 REQUIRED 传播行为:转账和审计操作在同一个事务中执行,要么都成功,要么都失败。
@Transactional(propagation = Propagation.REQUIRED)
public void transfer(...) {
// ...
}
@Transactional(propagation = Propagation.REQUIRED)
public void audit(...) {
// ...
}
- 使用 REQUIRES_NEW 传播行为:转账和审计操作在不同的事务中执行,互不影响。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void transfer(...) {
// ...
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void audit(...) {
// ...
}
- 使用 NESTED 传播行为:转账和审计操作在嵌套事务中执行,审计操作可以独立回滚,但提交依赖于转账操作。
@Transactional(propagation = Propagation.REQUIRED)
public void transfer(...) {
// ...
audit(...);
}
@Transactional(propagation = Propagation.NESTED)
public void audit(...) {
// ...
}
总结
本文详细介绍了 Spring 事务传播机制的概念、不同传播行为的定义和使用方法以及具体的实例。通过了解 Spring 事务传播行为,开发者可以根据实际业务需求选择合适的传播行为,更好地控制事务的执行方式。