问题描述:
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;
}