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. XML入門(mén)精解之結(jié)構(gòu)與語(yǔ)法2. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera3. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)4. 利用CSS3新特性創(chuàng)建透明邊框三角5. XML入門(mén)的常見(jiàn)問(wèn)題(一)6. HTML5 Canvas繪制圖形從入門(mén)到精通7. 概述IE和SQL2k開(kāi)發(fā)一個(gè)XML聊天程序8. HTML <!DOCTYPE> 標(biāo)簽9. HTML DOM setInterval和clearInterval方法案例詳解10. XML入門(mén)的常見(jiàn)問(wèn)題(二)
