问题描述:
@Transactional(rollbackFor = Exception.class)
public void methodA() {
methodB();
}
public void methodB(){
try{
// 某段数据库操作方法触发异常,这个很重要哦,不是数据库操作方法触发不了事务回滚机制
// 具体不太清楚,猜测类似于内部事务出现异常
}catch(){
logger.info("异常出现了,但不抛出,内部消化了");
}
}
最终会抛出异常 Transaction rolled back because it has been marked as rollback-only
并回滚。
但是重点来了,正常如果想正常回滚,又不想出现这个 rollback-only 异常提示,只需要在catch中重新抛出异常就可以了,问题是我不想回滚,还想让程序走下去。
解决方法:
//事务管理
private DataSourceTransactionManager dataSourceTransactionManager = SpringUtils.getBean(DataSourceTransactionManager.class);
private TransactionDefinition transactionDefinition = SpringUtils.getBean(TransactionDefinition.class);
public void methodB(){
try{
// 手动开启一个事务
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
//这句代码是重点,
dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(false);
// 某段数据库操作方法触发异常,这个很重要哦,不是数据库操作方法触发不了事务回滚机制
// 具体不太清楚,猜测类似于内部事务出现异常
}catch(){
logger.info("异常出现了,但不抛出,内部消化了");
}
// 提交事务
dataSourceTransactionManager.commit(transactionStatus);
// 恢复配置
dataSourceTransactionManager.setGlobalRollbackOnParticipationFailure(true);
}
参考资料:Spring-Boot 出现Transaction marked as rollback only异常_- JackCen的博客-CSDN博客