关于事务报错解决do not call commit or rollback more than once per transaction报错的分析

关于do not call commit or rollback more than once per transaction报错的分析

错误日志

org.springframework.transaction.IllegalTransactionStateException: Transaction is already completed - do not call commit or rollback more than once per transaction
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:804) ~[spring-tx-5.3.12.jar:5.3.12]
	at com.cxstar.business.service.impl.EBookCollectionServiceImpl.delete(EBookCollectionServiceImpl.java:304) ~[classes/:na]
	at com.cxstar.api.business.controller.collection.EBookCollectionController.delete(EBookCollectionController.java:105) ~[classes/:na]
	at com.cxstar.api.business.controller.collection.EBookCollectionController$$FastClassBySpringCGLIB$$5a53a40a.invoke(<generated>) ~[classes/:na]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.12.jar:5.3.12]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.12.jar:5.3.12]

问题分析:

该报错信息的意思是:每个事务调用提交或回滚的次数不要超过一次,在try-catch捕捉到异常进行rollback之后,又执行了finally的commit的方法

报错场景

常见的代码错误如下:

try{

	//业务代码,执行增改查
	
}catch ( Exception e){
      transactionManager.rollback(transactionStatus);
 }finally {
      transactionManager.commit(transactionStatus);
}

如果业务代码中报错,就会被catch捕捉到并且执行事务回滚,但是最后又执行finally的commit的方法,才会导致此问题的发生

解决方案

1.执行rollback之后,直接抛异常退出当前执行的方法

try{
	//业务代码,执行增改查
}catch ( Exception e){
      transactionManager.rollback(transactionStatus);
      throw new BusinessException(e.getMessage());
 }finally {
      transactionManager.commit(transactionStatus);
}

2.去除finally,把事务提交的commit方法放到catch之前

try{
	//业务代码,执行增改查
	transactionManager.commit(transactionStatus);
}catch ( Exception e){
     transactionManager.rollback(transactionStatus);
     throw new BusinessException(e.getMessage());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐州蔡徐坤

又要到饭了兄弟们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值