[Spring] Spring事务与事务的传播
在Spring框架中,事务传播行为定义了方法调用时事务的创建、传递和执行的规则。Spring支持7种事务传播行为:
- REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
- SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
- MANDATORY:使用当前事务,如果当前没有事务,就抛出异常。
- REQUIRES\_NEW:新建事务,如果当前存在事务,把当前事务挂起。
- NOT\_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则在嵌套事务内执行。如果没有当前事务,则执行与REQUIRED类似的操作。
示例代码:
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public class SomeService {
@Transactional(propagation = Propagation.REQUIRED)
public void someMethod() {
// 执行数据库操作
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void anotherMethod() {
// 这个方法会执行在新的事务中,不管当前是否有事务存在
}
@Transactional(propagation = Propagation.NESTED)
public void nestedMethod() {
// 如果当前存在事务,这个方法会执行在嵌套事务内,否则就像REQUIRED一样执行
}
}
在这个例子中,someMethod
和 anotherMethod
都被标记为 @Transactional
注解,propagation
属性分别设置为 Propagation.REQUIRED
和 Propagation.REQUIRES_NEW
,表示它们的事务传播行为。nestedMethod
使用 Propagation.NESTED
表示它可能在现有事务中嵌套执行,如果没有现有事务,它将以与 REQUIRED
相同的方式执行。
评论已关闭