如何在 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_NEW
,Propagation.REQUIRED
,TransactionAspectSupport.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。你也可能有一些问题......
@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_NEW
,Propagation.REQUIRED
,TransactionAspectSupport.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。你也可能有一些问题......