Spring Data:JPA 和嵌套事务

我遇到了 Spring JPA Data 和嵌套事务的问题。以下是我的服务的嵌套事务的两种方法。


@Service

public UserService {


    @Transactional

    public User createUser(UserDto userDto) {

        ....

        user = saveUser(user);

        sendEmail(user);

        ....

    }


    @Transactional(propagation = Propagation.REQUIRES_NEW)

    public User saveUser(User user) {

        return userRepository.save(user);

    }

碰巧有一种情况,方法 userRepository.save() 应该抛出异常,但不知何故没有被抛出,看起来它正在等待父事务完成。我期待在 saveUser 方法和 sendEmail 方法上抛出异常,甚至不会执行。


因为该方法UserService.saveUser将传播设置为Propagation.REQUIRES_NEW我期望提交该事务(要执行的 SQL 语句)并且传播任何异常。


我没有设置任何与事务相关的东西,所以我相信刷新模式设置为自动。


谁能发现我做错了什么或我的误解是什么?


慕斯709654
浏览 178回答 1
1回答

斯蒂芬大帝

这是因为您正在@Transactional从同一个 bean 中调用方法。@Transactional仅适用于在 spring 创建的代理上调用的方法。这意味着,当您创建 @Service 或其他 bean 时,从外部调用的方法将是事务性的。如果从 bean 中调用,什么都不会发生,因为它不通过代理对象。最简单的解决方案是将方法移动到另一个 @Service 或 bean。如果你真的想将它保存在同一个组件中,那么你需要调用它,以便它被 spring AOP 包装在代理中。你可以这样做:private YourClass self;@Autowiredprivate ApplicationContext applicationContext;@PostConstructpublic void postContruct(){    self = applicationContext.getBean(YourClass.class);}然后调用方法self将导致打开事务。换句话说:你没有遇到任何这些异常,因为@TransactionaloversaveUser不起作用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java