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();


标题:AOP事务监控与手动开启事务冲突解决
作者:linrty
地址:https://blog.linrty.top/articles/2024/09/02/1725263453359.html

    评论
    0 评论
avatar

取消