Java 如何在Spring Boot上使用相同方法回滚2个事务

Java 如何在Spring Boot上使用相同方法回滚2个事务,java,spring,spring-boot,transactions,Java,Spring,Spring Boot,Transactions,我在save方法中有两种方法。如您所见,method2有一个错误 我运行程序,第一个方法打印到数据库。但是,如果第二个方法不正确,我希望回滚过程失败,并且第一个方法不会写入数据库。我怎么做 我试图在method1和method2上使用@Transaction注释,但错误仍然存在。我尝试了Propagation.REQUIRES_NEW,和Propagation.REQUIRED,TransactionSpectSupport.currentTransactionStatus().setRollb

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

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


我试图在method1和method2上使用
@Transaction
注释,但错误仍然存在。我尝试了
Propagation.REQUIRES_NEW
,和
Propagation.REQUIRED
TransactionSpectSupport.currentTransactionStatus().setRollbackOnly()从未更改。

这是您尝试执行的完全合乎逻辑的操作。当流程的某一部分失败时回滚是正常的

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

  • @Transactional
    默认情况下,只有在引发
    运行时异常时才回滚。你可以定制这个。查一下文件,很容易找到。小心,确保使用
    org.springframework.transaction.annotation.Transactional
    。你有更多的选择
  • 理解传播是关键。默认情况下,
    @Transactional
    的传播是
    必需的
    ,这意味着它将加入现有事务或创建新事务<代码>需要_New
始终创建一个新代码。在您的情况下,
Propagation.REQUIRED
是最好的选择
  • 在事务方法中,在类中的其他方法上添加
    @Transactional
    并进行内部调用将不会产生任何效果。当您从类外部输入方法时,事务开始。一旦您进入类,其他注释将不会影响运行时
  • 需要考虑的三件事/问题:

    • 抛出
      RoleRepository.save(…)
      是什么样的错误
    • 背景是什么?这是考试吗?它是一个正在运行的应用程序吗?你能提供更多的代码吗
    • 正如一篇评论中所说,请阅读以下内容:。你可能也有一些问题

    这完全符合逻辑。当流程的某一部分失败时回滚是正常的

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

    • @Transactional
      默认情况下,只有在引发
      运行时异常时才回滚。你可以定制这个。查一下文件,很容易找到。小心,确保使用
      org.springframework.transaction.annotation.Transactional
      。你有更多的选择
    • 理解传播是关键。默认情况下,
      @Transactional
      的传播是
      必需的
      ,这意味着它将加入现有事务或创建新事务<代码>需要_New
      始终创建一个新代码。在您的情况下,
      Propagation.REQUIRED
      是最好的选择
    • 在事务方法中,在类中的其他方法上添加
      @Transactional
      并进行内部调用将不会产生任何效果。当您从类外部输入方法时,事务开始。一旦您进入类,其他注释将不会影响运行时
    需要考虑的三件事/问题:

    • 抛出
      RoleRepository.save(…)
      是什么样的错误
    • 背景是什么?这是考试吗?它是一个正在运行的应用程序吗?你能提供更多的代码吗
    • 正如一篇评论中所说,请阅读以下内容:。你可能也有一些问题

    我不推荐双重
    @Transactional
    。在
    save
    方法上只有一个事务,整个发送要么成功,要么失败。如果没有,则表示您的tx设置中有一些奇怪的东西,或者正在使用不支持事务的DB。您是否将MySQL与MyISAM表一起使用(因为这些表不支持事务)。您从何处调用
    save
    ,以及
    UserService
    的定义是什么?Sandeep,我删除了第一个事务性错误,但错误没有改变@Denium先生,我使用mysql。chrylis-罢工-我更改了我的代码检查您的表,如果它们是MyISAM类型,它们不是事务性的,请使用InnoDB类型支持事务。我不建议使用双重
    @transactional
    。在
    保存
    方法上只有一个事务,整个发送要么成功,要么失败。如果没有,则表示您的tx设置中有一些奇怪的东西,或者正在使用不支持事务的DB。您是否将MySQL与MyISAM表一起使用(因为这些表不支持事务)。您从何处调用
    save
    ,以及
    UserService
    的定义是什么?Sandeep,我删除了第一个事务性错误,但错误没有改变@Denium先生,我使用mysql。chrylis-on strike-i change MyCodeCheck你的表,如果它们是MyISAM类型,它们不是事务性的,请使用InnoDB类型来支持事务。嗨,首先,我将MySql表类型更改为InnoDB,它成功了。谢谢你提供的信息,我正在学习事务管理。该错误是一个基本的验证错误。method2大小最小参数为3,字符串值的长度大于tahn 3。这是一个rest应用程序,我没有使用测试。我更改了我的问题并添加了rest控制器。非常感谢你的链接,我将阅读。谢谢如果它对你有用,别忘了标记答案是正确的。嗨,首先,我把MySql表类型改为InnoDB,它成功了。谢谢你提供的信息,我正在学习事务管理。该错误是一个基本的验证错误。method2大小最小参数为3,字符串值的长度大于tahn 3。这是一个rest应用程序,我没有使用测试。我更改了我的问题并添加了rest控制器。非常感谢你的链接,我将阅读。谢谢如果对你有用,别忘了记下答案是
    @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");
        }