Java 如何在Spring Boot上使用相同方法回滚2个事务
我在save方法中有两种方法。如您所见,method2有一个错误 我运行程序,第一个方法打印到数据库。但是,如果第二个方法不正确,我希望回滚过程失败,并且第一个方法不会写入数据库。我怎么做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
我试图在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");
}