Spring Data:JPA 和嵌套事务

mps*_*tos 1 java spring jpa spring-data-jpa kotlin

我在 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

And*_*cus 6

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

然后调用方法 onself将导致打开一个事务。

换句话说:您没有遇到任何异常情况,因为@Transactional超过saveUser不起作用。