【发布时间】:2019-07-01 04:42:18
【问题描述】:
我有以下代码:
@Service
public class ItemService {
...
public void addItems(@Nonnull DocumentDTO dto) throws Exception {
// some code that takes some time to process
...
addItems(dto.getDocId(), items);
}
@Transactional
public void addItems(long docId, @Nonnull List<Item> items) {
itemDao.addItems(docId, items);
}
}
第一个方法不是@Transactional,它用@Transactional 调用第二个方法。 SonarLint 工具指出“方法不应调用具有不兼容的“@Transactional”值的同类方法”(https://rules.sonarsource.com/java/RSPEC-2229)
但是这段代码在 Spring 4.3.20 中可以正常工作。此规则是否适用于 Spring 4.3.20?
附:有趣的是,如果我将第二种方法设为包私有,SonarLint 警告就会消失……为什么?
【问题讨论】:
-
由于 springs 基于代理的 AOP 实现(反过来由 @Transactional 注释使用),只有在从类外部(通过代理)调用该方法时,事务才会处于活动状态。内部方法调用不会在事务中运行。
-
要回答“为什么有效”的问题,您需要显示
itemDao.addItems代码。 -
当你说它工作时,你看到的是成功写入数据。发生故障时回滚是行不通的。它实际上是在使用 auto_commit 进行数据库写入。
标签: java spring sonarqube aop sonarlint