声纳问题 - 交易

Sonar issue - transactions

我正在为声纳问题苦苦挣扎:

squid:S2229 "Methods should not call same-class methods with incompatible "@Transactional" values"

我不确定我该如何解决这个问题。我应该在 clean 方法上方添加 @Transactional 还是什么?甚至删除 @Transactional 注释。

@Override
public void clean(BooleanSupplier isInterrupted) {
        // other code
        while (shouldContinue(isInterrupted) && partitionsIterator.hasNext()) {
            PartitionDeleteSql partition = partitionsIterator.next();
            execute(partition);
        }
    }

@Transactional
public void execute(PartitionDeleteSql sql) {
       // other code
       getJdbcTemplate().execute(sql....());
       getJdbcTemplate().execute(sql....());
       getJdbcTemplate().execute(sql....());
}

Sonar 指出的问题是非事务方法 clean 调用事务方法 execute。因此 execute 上的 @Transactional 注释将被忽略,并且该方法将不会在事务模式下执行。

您必须用 @Transactional.

注释 clean 方法或整个 class

此外,class 本身必须注册为 Spring bean,例如使用 @Service@Copmonent,否则将不会创建代理包装器 bean这样 class.

阅读更多信息:Spring - @Transactional - What happens in background?