Spring 事务再梳理之 Propagation 基本使用
历史笔记
拼班服务 GroupServiceImpl.java 中有一个供外部调用的方法;
/**
* 强制调用该方法的地方必须声明事务
*/
@Override
@Transactional(propagation = Propagation.MANDATORY, rollbackFor = Throwable.class)
public void dealTradeEvent(TradeEvent tradeEvent) {
try {
dealTradeEventDetail(tradeEvent);
} catch (Exception e) {
log.error("处理订单事件失败", e);
}
}
现在对 @Transactional
中 propagation 属性做一些学习笔记
public @interface Transactional {
// 同 transactionManager
@AliasFor("transactionManager")
String value() default "";
// 指定事务的限定值
@AliasFor("value")
String transactionManager() default "";
// 传播特性
Propagation propagation() default Propagation.REQUIRED;
// 隔离级别
Isolation isolation() default Isolation.DEFAULT;
// 超时时间
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
// 只读
boolean readOnly() default false;
// 指示哪些异常必须引起事务回滚
Class<? extends Throwable>[] rollbackFor() default {};
// 指示哪些异常类型必须不导致事务回滚。
Class<? extends Throwable>[] noRollbackFor() default {};
}
这里使用的 propagation = Propagation.MANDATORY 只是一种情况,其他还有
- 默认使用 Propagation.REQUIRED
支持当前事务
,如果不存在则创建一个新事务;(支持当前事务
即调用当前方法的地方声明的事务)
- Propagation.SUPPORTS
支持当前事务
,如果不存在则非事务执行
- Propagation.MANDATORY
支持当前事务
,如果不存在则抛出异常
- Propagation.REQUIRES_NEW
创建一个新事务
,如果当前已存在事务则挂起该事务,使用新建的事务
- Propagation.NOT_SUPPORTED
非事务执行
,如果当前已存在事务则暂停该事务
- Propagation.NEVER
非事务执行
,如果当前已存在事务则抛出异常
- Propagation.NESTED
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务
来运行;
如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。