Service手动回滚事务

很多业务场景下,可以使用自动回滚事务。
如在一个Service中,可以使用注解形式整体回滚事务。

1
2
3
4
5
6
7
8
9
10
@Transactional(rollbackFor = Exception.class)
public Boolean methodName() {
boolean flag = true;
if (flag) {
// 处理业务
} else {
throw new RuntimeException("xxx");
}
return flag;
}

但也可能遇到如果对外提供API方法(RPC)需要捕获异常的处理业务的话,对于接口调用方仅需要知道错误信息即可,无需了解堆栈信息,此时try-catch后可以手动回滚事务。

1
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

1
2
3
4
5
6
7
8
9
10
11
@Transactional
public Boolean methodName() {
boolean flag = true;
try {
// 处理业务
} catch(Exception e) {
// log
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return flag;
}