gpt4 book ai didi

java - Spring 4.3中从非事务方法调用@Transactional方法

转载 作者:行者123 更新时间:2023-12-02 11:20:27 27 4
gpt4 key购买 nike

我有以下代码:

@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 吗?

附注有趣的是,如果我将第二种方法设置为包私有(private),SonarLint 警告就会消失......为什么?

最佳答案

But this code works correctly in Spring 4.3.20. Is this rule actual for Spring 4.3.20?

是的。 SonarLint 是正确的。自调用无法使@Transactional生效。即使在 Spring 5 中它也没有改变。这就是 Spring AOP 的工作原理(请参阅 docs )。您的代码之所以有效,很可能是因为您在 itemDao 内启动了另一个事务(可能您在 ItemDao#addItems() 上标记了另一个 @Transactional)。

if I make the second method as package-private, the SonarLint warning disappears... Why?

不知道为什么。也许这是一个错误。正如本rule中提到的,当在私有(private)方法中标记 @Transactional 时,它应该给你警告。

关于java - Spring 4.3中从非事务方法调用@Transactional方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54567006/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com