繁体   English   中英

如何在 Spring Boot 上以相同的方法回滚 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");
    }

我在 save 方法中有 2 个方法。 如您所见,method2 有错误。

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

我尝试在方法 1 和方法 2 上使用@Transaction注释,但错误继续。 我试过Propagation.REQUIRES_NEWPropagation.REQUIRED , TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 从未改变。

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

我将提供更多背景信息以确保您拥有一切:

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

需要考虑的三件事/问题:

暂无
暂无

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

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