繁体   English   中英

春季数据:JPA和嵌套事务

[英]Spring Data: JPA and Nested Transaction

我在使用Spring JPA数据和嵌套事务时遇到问题。 以下是我的服务的嵌套事务的两种方法。

@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语句),并传播任何异常。

我没有设置与事务相关的任何内容,因此我相信刷新模式设置为AUTO。

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

这是因为您要从同一bean内调用@Transactional方法。

@Transactional仅适用于在spring创建的代理上调用的方法。 这意味着,当您创建@Service或其他bean时,从外部调用的方法将是事务性的。 如果从Bean中调用,则不会发生任何事情,因为它不会通过代理对象。

最简单的解决方案是将方法移至另一个@Service或bean。 如果您真的想将其保留在同一组件中,则需要调用它,以便在Spring AOP中将其包装在代理中。 您可以这样做:

private YourClass self;

@Autowired
private ApplicationContext applicationContext;

@PostConstruct
public void postContruct(){
    self = applicationContext.getBean(YourClass.class);
}

然后在self上调用方法将导致打开交易。

换句话说: 您没有遇到任何这些异常,因为在saveUser上使用@Transactional saveUser

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM