Spring事务异常回滚,捕获异常不抛出就不会回滚
版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载,请标明转载地址!!!! https://blog.csdn.net/Crystalqy/article/details/79045512 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-db05db230f.css">
<div class="htmledit_views" id="content_views">
下面这种情况,使用了catch捕获了异常,
spring事务
不会发生回滚
spring事务
不会发生回滚
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力开通接口,开户异常,异常信息:"+e);
}
默认spring事务只在发生未被捕获的
RuntimeException
时才回滚。
RuntimeException
时才回滚。
springaop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获
RuntimeException
的异常,但可以通过配置来捕获特定的异常并回滚;
RuntimeException
的异常,但可以通过配置来捕获特定的异常并回滚;
解决方式
1:通过throw new RuntimeException();
抛出运行时异常
抛出运行时异常
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力开通接口,开户异常,异常信息:"+e);
throw new RuntimeException();
}
2:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();,手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();,手动回滚
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力开通接口,开户异常,异常信息:"+e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
3:
还有一种方法,而且是推荐方法:在这个代码所在的方法上加上rollbackFor ,形如:@Transactional(readOnly = true, rollbackFor = Exception.class)。这样也可以回滚。
还有一种方法,而且是推荐方法:在这个代码所在的方法上加上rollbackFor ,形如:@Transactional(readOnly = true, rollbackFor = Exception.class)。这样也可以回滚。
eg:
@Transactional(readOnly = true, rollbackFor = Exception.class)
public void getPermissionsByRoleId(long roleId) {
try {
dao.getPermissionsByRoleId(roleId);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力开通接口,开户异常,异常信息:"+e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
THE END