SpringBoot事務(wù)使用及回滾實(shí)現(xiàn)代碼詳解
Springboot中事務(wù)的使用:
1、啟動(dòng)類(lèi)加上@EnableTransactionManagement注解,開(kāi)啟事務(wù)支持(其實(shí)默認(rèn)是開(kāi)啟的)。
2、在使用事務(wù)的public(只有public支持事務(wù))方法(或者類(lèi)-相當(dāng)于該類(lèi)的所有public方法都使用)加上@Transactional注解。
在實(shí)際使用中一般是在service中使用@Transactional,那么對(duì)于controller->service流程中:
如果controller未開(kāi)啟事務(wù),service中開(kāi)始了事務(wù),service成功執(zhí)行,controller在之后的運(yùn)行中出現(xiàn)異常(錯(cuò)誤),不會(huì)自動(dòng)回滾。
也就是說(shuō),只有在開(kāi)啟事務(wù)的方法中出現(xiàn)異常(默認(rèn)只有非檢測(cè)性異常才生效-RuntimeException )(錯(cuò)誤-Error)才會(huì)自動(dòng)回滾。
如果想要對(duì)拋出的任何異常都進(jìn)行自動(dòng)回滾(而不是只針對(duì)RuntimeException),只需要在使用@Transactional(rollbackFor = Exception.class)即可。
開(kāi)啟事務(wù)的方法中事務(wù)回滾的情況:
①未發(fā)現(xiàn)的異常,程序運(yùn)行過(guò)程中自動(dòng)拋出RuntimeException或者其子類(lèi),程序終止,自動(dòng)回滾。
②使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();進(jìn)行手動(dòng)回滾。
③注意:如果在try-catch語(yǔ)句中對(duì)可能出現(xiàn)的異常(RuntimeException)進(jìn)行了處理,沒(méi)有再手動(dòng)throw異常,spring認(rèn)為該方法成功執(zhí)行,不會(huì)進(jìn)行回滾,此時(shí)需要調(diào)用②中方法進(jìn)行手動(dòng)回滾,如下圖:
另外,如果try-catch語(yǔ)句在finally中進(jìn)行了return操作,那么catch中手動(dòng)拋出的異常也會(huì)被覆蓋,同樣不會(huì)自動(dòng)回滾。
//不會(huì)自動(dòng)回滾try{ throw new RuntimeException();}catch(RuntimeException e){ e.printStackTrace();}finally{}//會(huì)自動(dòng)回滾try{ throw new RuntimeException();}catch(RuntimeException e){ e.printStackTrace(); throw new RuntimeException();}finally{}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. python 爬取豆瓣網(wǎng)頁(yè)的示例2. asp知識(shí)整理筆記4(問(wèn)答模式)3. Java雙向鏈表按照順序添加節(jié)點(diǎn)的方法實(shí)例4. AJAX的跨域問(wèn)題解決方案5. phpstudy apache開(kāi)啟ssi使用詳解6. Python實(shí)現(xiàn)播放和錄制聲音的功能7. Android實(shí)現(xiàn)簡(jiǎn)單用戶(hù)注冊(cè)案例8. 深入理解Android熱修復(fù)技術(shù)原理之代碼熱修復(fù)技術(shù)9. Javascript中Math.max和Math.max.apply的區(qū)別和用法詳解10. ASP 連接Access數(shù)據(jù)庫(kù)的登陸系統(tǒng)
