SpringBoot 的传播机制详解
SpringBoot 的传播机制详解
程序员朱永胜在 Spring Boot 中,事务传播机制(Transaction Propagation)是 Spring 事务管理的重要部分,它决定了一个事务方法如何参与已有事务或者如何创建新事务。Spring 的事务传播机制提供了多种传播行为,以适应不同的业务需求。下面是 Spring Boot 中常用的事务传播行为的详解:
事务传播行为类型
REQUIRED(默认值)
- 如果当前存在一个事务,则加入该事务;如果当前没有事务,则创建一个新事务。
- 适用于大多数场景,默认情况下推荐使用。
1
2
3
4
public void someMethod() {
// method logic
}
REQUIRES_NEW
- 总是创建一个新的事务。如果当前存在事务,则先挂起当前事务。
- 适用于需要独立事务的场景,如记录操作日志。
1
2
3
4
public void someMethod() {
// method logic
}
SUPPORTS
- 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
- 适用于可选的事务支持场景。
1
2
3
4
public void someMethod() {
// method logic
}
NOT_SUPPORTED
- 总是以非事务方式执行。如果当前存在事务,则挂起当前事务。
- 适用于不需要事务支持的操作,如读取操作等。
1
2
3
4
public void someMethod() {
// method logic
}
MANDATORY
- 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- 适用于必须在事务环境下执行的方法。
1
2
3
4
public void someMethod() {
// method logic
}
NEVER
- 总是以非事务方式执行。如果当前存在事务,则抛出异常。
- 适用于不能在事务环境中执行的操作。
1
2
3
4
public void someMethod() {
// method logic
}
NESTED
- 如果当前存在事务,则创建一个嵌套事务(保存点);如果当前没有事务,则创建一个新事务。
- 适用于需要部分回滚的场景。
1
2
3
4
public void someMethod() {
// method logic
}
具体使用场景及示例
假设有一个电商系统,包含下单和支付两个主要业务方法。为了更好地理解不同传播行为,我们通过具体示例来说明。
场景一:使用 REQUIRED(默认值)
1 |
|
在上述示例中,placeOrder
方法使用了默认的 REQUIRED 传播行为,如果 placeOrder
方法调用时已有事务存在,那么整个操作将在同一个事务中进行。如果没有事务存在,那么会创建一个新事务。
场景二:使用 REQUIRES_NEW
1 |
|
在上述示例中,processPayment
方法使用了 REQUIRES_NEW 传播行为,表示每次调用时都会创建一个新的事务,即使 placeOrder
方法中的事务失败了,也不会影响 processPayment
方法的事务。
场景三:使用 NESTED
1 |
|
1 |
|
在上述示例中,如果 decreaseStock
方法失败,只会回滚嵌套事务,placeOrder
方法的事务不会回滚,适用于需要部分回滚的场景。
总结
Spring Boot 提供的事务传播机制为开发者提供了灵活的事务管理方式,可以根据具体业务需求选择合适的传播行为。掌握这些传播行为可以帮助我们构建更健壮和灵活的事务管理系统。