Java Transaction silently rolled back because it has been marked as rollback-only问题解决

阳光穿透心脏的1/2处 2022-11-05 07:30 421阅读 0赞

问题描述:

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

问题分析:

1、嵌套的两个方法都加了@Transaction注解,事务嵌套导致了报错。

  1. @Transactional
  2. public void test1(){
  3. test2();
  4. }
  5. @Transactional
  6. public void test2(){
  7. double n=1/0;
  8. }

解决办法:

具体需求分为以下3种情况。

(1)仅仅解决这个报错,去掉其中一个方法的@Transaction注解。

  1. public void test1(){
  2. test2();
  3. }
  4. @Transactional
  5. public void test2(){
  6. double n=1/0;
  7. }

(2)不想去掉两个方法的@Transaction注解,因为这两个方法可能需要单独调用,但是里面的方法报错,两个事务都需要回滚。这时候需要针对里面的方法报错进行手动回滚事务。

  1. @Transactional
  2. public void test1(){
  3. int n=1/0;
  4. try{
  5. test2();
  6. }catch(Exception e){
  7. e.printStackTrace();
  8. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  9. }
  10. }
  11. @Transactional
  12. public void test2(){
  13. double n=1/0;
  14. }

(3)不想去掉两个方法的@Transaction注解,因为这两个方法可能需要单独调用,但是里面的方法报错时仅仅回滚里面的那层事务,而外面的方法不受影响。这时候需要针对外面的方法报错进行手动回滚事务。

  1. @Transactional
  2. public void test1(){
  3. try{
  4. int n=1/0;
  5. try{
  6. test2();
  7. }catch(Exception e){
  8. e.printStackTrace();
  9. }
  10. }catch(Exception e){
  11. e.printStackTrace();
  12. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  13. }
  14. }
  15. @Transactional
  16. public void test2(){
  17. double n=1/0;
  18. }

发表评论

表情:
评论列表 (有 0 条评论,421人围观)

还没有评论,来说两句吧...

相关阅读