AOP事务监控与手动开启事务冲突解决
1.问题描述:
AOP事务监控的代码生效(开关开启)后,因为使用了如下内容对事务进行拦截
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional) || execution(* org.springframework.transaction.support.TransactionTemplate.execute(..))")
public void pointcut() {
}
因为需要监控手动开启的事务比如MQL的事务,所以需要通过execution(* org.springframework.transaction.support.TransactionTemplate.execute(..)表达式表达手动事务的监控
因为AOP时基于动态代理来实现的,所以再开启代码后会对TransactionTemplate类实现一个同接口下的代理类,TransactionTemplate实现了TransactionDefinition接口
因此在使用Spring IOC容器管理Bean对象TransactionDefinition的时候,依赖注入的时候注入成了AOP代理的类对象,而isolationLevel字段时定义在DefaultTransactionDefinition下的,TransactionTemplate继承DefaultTransactionDefinition
所以开启AOP事务监控的时候,注入的TransactionDefinition对象不带有isolationLevel字段,从而导致了异常
2.解决方案:
①将原代码:
@Autowired
private TransactionDefinition transactionDefinition;
改为
private TransactionDefinition transactionDefinition = TransactionDefinition.withDefaults();
不交给Spring IOC容器管理,手动配置,因为框架提供了一个默认的单例对象,可以直接过去不需要创建
②将原代码:
//手动开启一个事务
transactionStatusSaveData1 = platformTransactionManager.getTransaction(transactionDefinition);
改为
transactionStatusSaveData1 = platformTransactionManager.getTransaction(null);
因为传入的值可以为null,当为null的时候内部会直接使用TransactionDefinition.withDefaults();
评论
0 评论