在 Spring 中,事务传播行为(Transaction Propagation Behavior)用于定义一个方法在已有事务上下文中执行时,如何处理事务。Spring 提供了多种事务传播行为,开发者可以根据需求选择适当的传播行为。以下是常见的几种事务传播行为:
-
REQUIRED(默认):
- 如果当前存在事务,则该方法在该事务内执行;如果当前没有事务,则会开启一个新的事务。
- 这是默认的传播行为,适用于绝大多数场景。
@Transactional(propagation = Propagation.REQUIRED) public void methodWithTransaction() { // 业务逻辑 }
-
SUPPORTS:
- 如果当前存在事务,则该方法在该事务内执行;如果当前没有事务,则该方法以非事务的方式执行。
@Transactional(propagation = Propagation.SUPPORTS) public void methodWithTransactionSupports() { // 业务逻辑 }
-
MANDATORY:
- 该方法必须在一个已有的事务中执行,如果当前没有事务,则会抛出异常。
@Transactional(propagation = Propagation.MANDATORY) public void methodWithTransactionMandatory() { // 业务逻辑 }
-
REQUIRES_NEW:
- 该方法会开启一个新的事务,如果当前存在事务,则将其挂起。
@Transactional(propagation = Propagation.REQUIRES_NEW) public void methodWithTransactionRequiresNew() { // 业务逻辑 }
-
NOT_SUPPORTED:
- 该方法以非事务的方式执行,如果当前存在事务,则将其挂起。
@Transactional(propagation = Propagation.NOT_SUPPORTED) public void methodWithTransactionNotSupported() { // 业务逻辑 }
-
NEVER:
- 该方法以非事务的方式执行,如果当前存在事务,则抛出异常。
@Transactional(propagation = Propagation.NEVER) public void methodWithTransactionNever() { // 业务逻辑 }
-
NESTED:
- 如果当前存在事务,则该方法在嵌套事务内执行;如果当前没有事务,则会开启一个新的事务。
- 嵌套事务是 Savepoint 的一种实现。
@Transactional(propagation = Propagation.NESTED) public void methodWithNestedTransaction() { // 业务逻辑 }
这些事务传播行为可以在 @Transactional
注解中的 propagation
属性中进行设置。选择适当的传播行为有助于确保事务的一致性和隔离性。
Was this helpful?
0 / 0