Spring boot Spring事务-如何拆分我的方法

Spring boot Spring事务-如何拆分我的方法,spring-boot,hibernate,transactions,Spring Boot,Hibernate,Transactions,我有控制器调用的以下方法: @Transactional public Note getById(Long noteId, Collection<Authority> authorities) { permissionService.actionAllowed(authorities, Permission.NOTE); return getNote(noteId); } private Note getNote(Long noteId)

我有控制器调用的以下方法:

@Transactional
public Note getById(Long noteId, Collection<Authority> authorities) {
        permissionService.actionAllowed(authorities, Permission.NOTE);
        return getNote(noteId);
    }

 private Note getNote(Long noteId) {
        return repository.findById(noteId)
                .orElseThrow(() -> new MyException("Note does not exist"));
}
@Transactional
公共便笺getById(长便笺ID,收款机构){
permissionService.actionAllowed(权限,Permission.NOTE);
返回getNote(noteId);
}
私人备忘getNote(长备忘ID){
返回repository.findById(noteId)
.orelsetrow(()->新的MyException(“注释不存在”);
}
问题是我们应该尽可能地缩短事务,因此我必须在事务范围之外调用我的验证方法
permissionService.actionAllowed
。如何以最好的方式做这件事?
我不想使用
@Transactional
创建其他公共方法。。。如果您只想在已经运行的事务之外执行
permissionService.actionAllowed
,您可以使用
@Transactional(TxType.NOT_SUPPORTED)
对该方法进行注释,这将暂停该调用()的运行事务


如果您希望对创建的事务进行更细粒度的控制,您也可以考虑切换到编程事务管理,例如使用

我不喜欢您处理的方式,即:第一层是“代码>控制器< /代码>,这样您就可以添加与API类似的请求、响应、标题、正文、状态代码等所有相关内容,第二层
服务
因此,您可以在那里添加所有与逻辑相关的内容,如验证、业务逻辑、对存储库的调用,第三层是
存储库
,所有内容都与DB类查询相关,然后,您可以在顶部的
服务
类中添加
@Transactional
注释,以便用于所有调用,或者像您在一个方法中添加的那样,因此这里的问题是无序的,如果您保持理想的方式,那么您可以做得更好。