[英]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_NEW
和Propagation.REQUIRED
, TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
从未改变。
这是完全合乎逻辑的,你正在尝试做。 当您的流程的一部分失败时回滚是正常的。
我将提供更多背景信息以确保您拥有一切:
@Transactional
仅在抛出RuntimeException
时回滚。 你可以自定义这个。 检查文档,很容易找到。 小心,确保您使用org.springframework.transaction.annotation.Transactional
。 你有更多的选择。@Transactional
是Required
的,这意味着它要么加入现有的交易,或者创建一个新的。 Requires_New
总是创建一个新的。 在你的情况下, Propagation.REQUIRED
是好的。@Transactional
并进行内部调用将不会有任何效果。 当您从类的外部进入您的方法时,事务就开始了。 一旦你进入你的班级,其他注解就不会影响运行时。需要考虑的三件事/问题:
RoleRepository.save(...)
出现什么样的错误?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.