如何在 Spring 启动时以相同的方法回滚 2 个事务

How to rollback with 2 transaction in same method on Spring Boot

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RoleRepository roleRepository;

    @Transactional
    public void save(String name) {
        method1(name);
        method2(name);
    }

public void method1(String name){
userRepository.save(name)
}

    public void method2(String name) {
        roleRepository.save(name);// Error
    }
}
public interface UserService {
    void save(String name) throws Exception;
}

@PostMapping("/save")
    public void save() throws Exception {

        userService.save("SomeThing");
    }

我在保存方法中有2个方法。可以看到,method2 有错误。

我运行程序,第一个方法打印到数据库。但是,如果第二种方法不正确,我希望回滚过程落下,第一种方法不写入数据库。我该怎么做?

我尝试在 method1 和 method2 上使用 @Transaction 注释,但错误继续存在。我尝试了 Propagation.REQUIRES_NEWPropagation.REQUIREDTransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 从未改变。

您的尝试完全合乎逻辑。当你的流程的一部分失败时回滚是正常的。

我会提供更多背景知识以确保您拥有一切:

  • @Transactional 仅回滚,默认情况下,当抛出 RuntimeException 时。你可以自定义这个。查看文档,很容易找到。小心,确保使用 org.springframework.transaction.annotation.Transactional。这个你有更多的选择。
  • 了解传播是关键。默认情况下,@Transactional 的传播是 Required,这意味着它要么加入现有事务,要么创建一个新事务。 Requires_New 总是创建一个新的。在你的情况下,Propagation.REQUIRED 是好的。
  • 一旦您处于事务性方法中,在 class 内的其他方法上添加 @Transactional 并进行内部调用将不会有任何效果。当您从 class 外部输入您的方法时,交易开始。一旦进入 class,其他注释将不会影响运行时。

三个things/questions考虑:

  • 抛出 RoleRepository.save(...) 是什么类型的错误?
  • 上下文是什么?是测试吗?它是 运行 应用程序吗?你能提供更多代码吗?
  • 如一条评论所述,请阅读以下内容:Spring Transaction Management with Hibernate and MySQL, Global and Local。你也可能有一些问题......