为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Data:JPA 和嵌套事务

Spring Data:JPA 和嵌套事务

慕斯709654 2022-06-23 17:55:37
我遇到了 Spring JPA Data 和嵌套事务的问题。以下是我的服务的嵌套事务的两种方法。@Servicepublic 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 语句)并且传播任何异常。我没有设置任何与事务相关的东西,所以我相信刷新模式设置为自动。谁能发现我做错了什么或我的误解是什么?
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

这是因为您正在@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);

}

然后调用方法self将导致打开事务。


换句话说:你没有遇到任何这些异常,因为@TransactionaloversaveUser不起作用。


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信