文章
本文总阅读量

关于使用Qodana插件进行静态代码审查及解决措施?

安装Qodana插件

  1. 打开IDEA。
  2. 进入“File” > “Settings”(Mac用户为“IntelliJ IDEA” > “Preferences”)。
  3. 选择“Plugins”。
  4. 搜索“Qodana”并安装。

    截图

运行Qodana分析

  1. 打开“Tools” > “Qodana”。

    截图

  2. 确保qodana.yaml配置文件位于项目根目录,无需修改直接使用。
  3. 点击“Run”开始分析。

    截图

查看报告

  • 分析完成后,通过“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 进行授权