声纳问题 - 交易
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?
我正在为声纳问题苦苦挣扎:
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?