java - 在 Spring 4.3 中从非事务方法调用 @Transactional 方法
问题描述
我有以下代码:
@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?
PS 有趣的是,如果我将第二种方法设为私有包,SonarLint 警告就会消失……为什么?
解决方案
但是这段代码在 Spring 4.3.20 中可以正常工作。此规则是否适用于 Spring 4.3.20?
是的。SonarLint 是正确的。自调用不能@Transactional
生效。即使在 Spring 5 中它也不会改变。这就是 Spring AOP 的工作方式(请参阅docs)。您的代码很可能有效,因为您在内部开始了另一笔交易itemDao
(可能是您在 @Transactional
上标记了另一笔交易ItemDao#addItems()
)。
如果我将第二种方法设为包私有,SonarLint 警告就会消失……为什么?
不知道为什么。也许这是一个错误。正如这条规则@Transactional
中提到的,在私有方法中标记时应该给你警告。
推荐阅读
- javascript - 如何在 react.js 中显示同一项目和不同日期的值的总和
- .net - 注册层失败:重新执行错误:退出状态 1:输出:hcsshim::ProcessBaseLayer \\?\D:\docker\windowsfilter\...:访问被拒绝
- ios - 从照片库中选择多个视频时 iOS 应用程序崩溃 - 内存警告
- node.js - “无法发送空消息”
- hdf5 - h5py 使用转义字符读取原始数据
- java - Spring JPA 并按输入字段排序
- python - 在 Django REST 框架中,使用带有渲染器的 ModelViewSet,
- php - Convert an associative array into an associative array which has a key with another associative array as its value in php
- asp.net-mvc - 布尔值总是被认为是假的,但它在数据库中是真的吗?MVC
- neural-network - 性能不佳有助于人工神经网络的多类分类