场景:
在spring aop的一个环绕增强方法中,多次修改数据库。
首次尝试:
在环绕增强方法上增加了注解@Transactional(rollbackFor = Exception.class)
@Aspect
public class StockManageAspect {
@Transactional(rollbackFor = Exception.class)
@Around("annotationPointcut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
...//第一次修改
Object result = joinPoint.proceed();//第二次修改
...//第三次修改
return result;
}
}
经过测试,无法控制事务,失败!
难道在@Aspect切面类中不能使用@Transactional注解???
第二次:
采用手动控制事务提交的方式
参考自:SpringBoot手动控制事务
@Aspect
public class StockManageAspect {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
@Around("annotationPointcut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
TransactionStatus transactionStatus=null;
Object result = null;
try {
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
...//第一次修改
result = joinPoint.proceed();//第二次修改
...//第三次修改
dataSourceTransactionManager.commit(transactionStatus);
} catch (Exception e) {
if (!ObjectUtil.isNull(dataSourceTransactionManager)) {
dataSourceTransactionManager.rollback(transactionStatus);
}
}
return result;
}
}
经过测试,能够控制事务,成功!