关于使用Qodana插件进行静态代码审查及解决措施?
安装Qodana插件
运行Qodana分析
查看报告
分析完成后,通过“Tools” > “Qodana”查看报告,或在IDEA底部窗口中查看。
根据报告中的问题和建议修改代码。
MyBatis-Plus @Transactional 事务失效问题
代码示例
1
2
3
4
5
6
@Override
@Transactional
public void createOrder(List<Order> orders) {
log.info(dataSource.getClass().getName());
this.saveBatch(orders);
}
测试场景描述
- 第一条数据:字段长度未超长,能够正常插入数据库。
- 第二条数据:字段长度超出了数据库定义的长度限制,导致插入操作失败并抛出异常。
问题现象
尽管在方法上使用了 @Transactional 注解以期望实现事务管理,但在上述测试场景中,当第二条数据因字段长度超长而插入失败时,第一条数据并没有因为异常的发生而回滚。这表明当前环境中 @Transactional 的事务管理功能未能按照预期生效。
关于解决 @Transactional 自调用问题的措施
1. 使用 ApplicationContextProvider
通过 Spring 上下文来获取代理对象,而不是直接调用内部方法。
Spring 会根据 @Transactional 的注解生成代理对象,从而使事务得以管理。
例如:
1
ApplicationContextProvider.getBean(BankFlowScheduleService.class).refreshAccountSerialRank();
2. 使用 @Transactional 和类拆分
将需要事务管理的方法提取到一个新的 Spring Bean 中。这样可以确保方法调用跨越不同的类实例,从而避免自调用问题。
提取方法到新 Bean:
- 将需要事务管理的方法移动到一个新的 Spring Bean 中。
- 确保方法调用跨越不同的类实例。
本文由作者按照 CC BY 4.0 进行授权



