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

问题描述:

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

问题分析:

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

@Transactional
public void test1(){
    test2();
}
@Transactional
public void test2(){
    double n=1/0;
}

解决办法:

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

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

public void test1(){
    test2();
}
@Transactional
public void test2(){
    double n=1/0;
}

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

@Transactional
public void test1(){
    int n=1/0;
    try{
        test2();
    }catch(Exception e){
        e.printStackTrace();
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}
@Transactional
public void test2(){
    double n=1/0;
}

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

@Transactional
public void test1(){
    try{
        int n=1/0;
        try{
            test2();
        }catch(Exception e){
            e.printStackTrace();
        }
    }catch(Exception e){
        e.printStackTrace();
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

@Transactional
public void test2(){
    double n=1/0;
}

猜你喜欢

转载自blog.csdn.net/qq_38974638/article/details/114371348