解決try-catch捕獲異常信息后Spring事務(wù)失效的問題
一、首先在Spring Boot項(xiàng)目中,手動(dòng)添加異常方法進(jìn)行測(cè)試
@Transactional(rollbackFor=Exception.class) //表示此方法有異常時(shí)觸發(fā)Spring事務(wù)
@Override
public CommonResult<User> saveUser(User user) {
int insert = baseMapper.insert(user);
try {
// 添加異常,并進(jìn)行捕獲
int a = 10/0;
}catch (Exception e){
logger.info("打印異常信息:"+e);
return CommonResult.commentFailure("服務(wù)器異常,事務(wù)回滾");
}
if(insert > 0){
return CommonResult.commentSuccess(user);
}else {
return CommonResult.commentFailure("添加失敗");
}
}
1、一個(gè)添加信息的實(shí)現(xiàn)類方法上,此處我們加了Spring的事務(wù)。
2、問題:一個(gè)方法報(bào)異常(int a = 10/0)進(jìn)行了異常捕獲,另一個(gè)方法不會(huì)回滾(insert添加方法)
這是什么情況呢,相當(dāng)于Spring事務(wù)策略失效了。
try-catch捕獲了異常后,這種業(yè)務(wù)方法也就等于脫離了spring事務(wù)的管理,因?yàn)闆]有任何異常會(huì)從業(yè)務(wù)方法中拋出,全被捕獲并“吞掉”,導(dǎo)致spring異常拋出觸發(fā)事務(wù)回滾策略失效。
通俗的來說:默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的 runtimeexcetpion或error時(shí)才回滾。
二、處理方案一
spring aop 異常捕獲進(jìn)而回滾。在catch中最后加上throw new runtimeexcetpion(),這樣程序異常時(shí)才能被aop捕獲進(jìn)而回滾,缺點(diǎn)是無法return異常信息提示,前端用戶交互效果不佳
@Transactional(rollbackFor=Exception.class) //表示此方法有異常時(shí)觸發(fā)Spring事務(wù)
@Override
public CommonResult<User> saveUser(User user) {
int insert = baseMapper.insert(user);
try {
// 添加異常,并進(jìn)行捕獲
int a = 10/0;
}catch (Exception e){
logger.info("異常信息:"+e);
// 方案一:spring aop 異常捕獲
throw new RuntimeException();
}
if(insert > 0){
return CommonResult.commentSuccess(user);
}else {
return CommonResult.commentFailure("添加失敗");
}
}
三、處理方案二
就是讓一個(gè)方法報(bào)異常,另一個(gè)方法回滾,這樣才能真正的觸發(fā)Spring事務(wù)回滾策略。
catch語句中增加:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手動(dòng)回滾,這樣上層就無需去處理異常了
完整代碼:
@Transactional(rollbackFor=Exception.class) //表示此方法有異常時(shí)觸發(fā)Spring事務(wù)
@Override
public CommonResult<User> saveUser(User user) {
int insert = baseMapper.insert(user);
try {
// 添加異常,并進(jìn)行捕獲
int a = 10/0;
}catch (Exception e){
logger.info("異常信息:"+e);
// 方案二:手動(dòng)回滾
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return CommonResult.commentFailure("服務(wù)器異常,事務(wù)回滾");
}
if(insert > 0){
return CommonResult.commentSuccess(user);
}else {
return CommonResult.commentFailure("添加失敗");
}
}
四、如過需要手動(dòng)進(jìn)行手動(dòng)回滾的業(yè)務(wù)方法比較多,我們可以寫一個(gè)公共的工具類
SpringRollBackUtil.java
public class SpringRollBackUtil {
/**
* 事務(wù)回滾機(jī)制
*/
public static void rollBack() {
try {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} catch (Exception e) {
e.printStackTrace();
}
}
}
只需調(diào)用方法即可
// 方案三:公共工具類 手動(dòng)回滾 SpringRollBackUtil.rollBack();
Spring mvc:事務(wù)引起的try/catch失效
在測(cè)試一個(gè)接口時(shí),發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象:
該接口使用@ResponseBody注解返回json格式數(shù)據(jù),并且使用try/catch包括全部邏輯代碼,debug后發(fā)現(xiàn)返回?cái)?shù)據(jù)沒有任何錯(cuò)誤,只包含一段因產(chǎn)生異常導(dǎo)致的錯(cuò)誤提示字符串,但是chrome瀏覽器network卻顯示http狀態(tài)碼為500。
最后發(fā)現(xiàn)在該RequestMapping方法上還有一個(gè)注解@Transactional,去除ok。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序完整項(xiàng)目實(shí)戰(zhàn)記錄(前端+SpringBoot后端)
隨著微信小程序的流行,越來越多的開發(fā)者開始涉足小程序開發(fā),下面這篇文章主要給大家介紹了關(guān)于微信小程序完整項(xiàng)目實(shí)戰(zhàn)的相關(guān)資料,項(xiàng)目包括前端+SpringBoot后端,需要的朋友可以參考下2024-09-09
Java list.remove( )方法注意事項(xiàng)
這篇文章主要介紹了Java list.remove( )方法注意事項(xiàng),非常簡(jiǎn)單易懂,需要的朋友可以參考下2018-08-08
spring Profile如何為不同環(huán)境提供不同的配置支持
這篇文章主要介紹了spring Profile如何為不同環(huán)境提供不同的配置支持,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Springboot全局異常捕獲及try catch區(qū)別解析
這篇文章主要介紹了Springboot全局異常捕獲及try catch區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
IDEA部署JavaWeb項(xiàng)目到Tomcat服務(wù)器的方法
這篇文章主要介紹了IDEA部署JavaWeb項(xiàng)目到Tomcat服務(wù)器的方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-06-06
BeanFactory與ApplicationContext的區(qū)別示例解析
這篇文章主要為大家介紹了BeanFactory與ApplicationContext的區(qū)別示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
使用maven對(duì)springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案
springboot項(xiàng)目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個(gè)插件默認(rèn)情況下,會(huì)把所有的依賴包全部壓縮到一個(gè)jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下2024-02-02
mybatis-plus與mybatis共存的實(shí)現(xiàn)
本文主要介紹了mybatis-plus與mybatis共存的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

