SpringBoot事務(wù)使用及回滾實(shí)現(xiàn)代碼詳解
Springboot中事務(wù)的使用:
1、啟動(dòng)類加上@EnableTransactionManagement注解,開啟事務(wù)支持(其實(shí)默認(rèn)是開啟的)。
2、在使用事務(wù)的public(只有public支持事務(wù))方法(或者類-相當(dāng)于該類的所有public方法都使用)加上@Transactional注解。
在實(shí)際使用中一般是在service中使用@Transactional,那么對(duì)于controller->service流程中:
如果controller未開啟事務(wù),service中開始了事務(wù),service成功執(zhí)行,controller在之后的運(yùn)行中出現(xiàn)異常(錯(cuò)誤),不會(huì)自動(dòng)回滾。
也就是說,只有在開啟事務(wù)的方法中出現(xiàn)異常(默認(rèn)只有非檢測(cè)性異常才生效-RuntimeException )(錯(cuò)誤-Error)才會(huì)自動(dòng)回滾。
如果想要對(duì)拋出的任何異常都進(jìn)行自動(dòng)回滾(而不是只針對(duì)RuntimeException),只需要在使用@Transactional(rollbackFor = Exception.class)即可。
開啟事務(wù)的方法中事務(wù)回滾的情況:
①未發(fā)現(xiàn)的異常,程序運(yùn)行過程中自動(dòng)拋出RuntimeException或者其子類,程序終止,自動(dòng)回滾。
②使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();進(jìn)行手動(dòng)回滾。
③注意:如果在try-catch語句中對(duì)可能出現(xiàn)的異常(RuntimeException)進(jìn)行了處理,沒有再手動(dòng)throw異常,spring認(rèn)為該方法成功執(zhí)行,不會(huì)進(jìn)行回滾,此時(shí)需要調(diào)用②中方法進(jìn)行手動(dòng)回滾,如下圖:
另外,如果try-catch語句在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. PHP laravel實(shí)現(xiàn)導(dǎo)出PDF功能2. 使用Blazor框架實(shí)現(xiàn)在前端瀏覽器中導(dǎo)入和導(dǎo)出Excel3. python中文本字符處理的簡(jiǎn)單方法記錄4. vscode運(yùn)行php報(bào)錯(cuò)php?not?found解決辦法5. Python-openpyxl表格讀取寫入的案例詳解6. Python使用Selenium自動(dòng)進(jìn)行百度搜索的實(shí)現(xiàn)7. JavaScript實(shí)現(xiàn)留言板實(shí)戰(zhàn)案例8. ASP基礎(chǔ)知識(shí)Command對(duì)象講解9. JS中6個(gè)對(duì)象數(shù)組去重的方法10. 如何從Python的cmd中獲得.py文件參數(shù)

網(wǎng)公網(wǎng)安備