Java當(dāng)中讓事務(wù)回滾的幾種方式
在 Java 中,可以通過(guò)使用事務(wù)來(lái)保證數(shù)據(jù)庫(kù)操作的一致性和完整性。如果在事務(wù)過(guò)程中發(fā)生了異常或錯(cuò)誤,需要將事務(wù)回滾,以保證數(shù)據(jù)的正確性和完整性。
下面是在 Java 中讓事務(wù)回滾的幾種方式:
使用 Spring 事務(wù)管理:在 Spring 中,可以使用 @Transactional 注解來(lái)標(biāo)記需要進(jìn)行事務(wù)管理的方法,同時(shí)可以設(shè)置 rollbackFor 屬性指定回滾的異常類(lèi)型。例如:
@Service @Transactional(rollbackFor = Exception.class) public class UserService { // ... }
在上述代碼中,@Transactional 注解指定了回滾的異常類(lèi)型為 Exception,如果在 UserService 中出現(xiàn)了 Exception 類(lèi)型的異常,就會(huì)回滾事務(wù)。
手動(dòng)回滾事務(wù):如果不使用 Spring 事務(wù)管理,可以手動(dòng)回滾事務(wù)。例如:
Connection conn = dataSource.getConnection(); try { conn.setAutoCommit(false); // 執(zhí)行數(shù)據(jù)庫(kù)操作 // 如果出現(xiàn)異常,手動(dòng)回滾事務(wù) conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } finally { conn.setAutoCommit(true); conn.close(); }
在上述代碼中,將數(shù)據(jù)庫(kù)連接設(shè)置為手動(dòng)提交模式,并在事務(wù)過(guò)程中根據(jù)需要執(zhí)行數(shù)據(jù)庫(kù)操作。如果出現(xiàn)異常,就手動(dòng)回滾事務(wù)??傊琂ava 中可以使用 Spring 事務(wù)管理或手動(dòng)回滾事務(wù)等方式,來(lái)保證事務(wù)的一致性和完整性,并防止出現(xiàn)異常或錯(cuò)誤時(shí)影響數(shù)據(jù)的正確性和完整性。
實(shí)現(xiàn)事務(wù)回滾需要注意的問(wèn)題:
1.@Transactional 注解可以被應(yīng)用于接口定義和接口方法、類(lèi)定義和類(lèi)的 public 方法上。
2.@Transactional 注解只能應(yīng)用到 public 可見(jiàn)度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不會(huì)報(bào)錯(cuò),但是這個(gè)被注解的方法將不會(huì)展示已配置的事務(wù)設(shè)置。
3.默認(rèn)情況下,spring會(huì)對(duì)unchecked異常進(jìn)行事務(wù)回滾;如果是checked異常則不回滾。
如果事務(wù)在try{}catch(Exception e){e.printStackTrace();}中跑,并且catch中只是打印e的話(huà),那么事務(wù)不會(huì)rollback。因?yàn)楫惓1籧atch掉了,框架不知道發(fā)生了常。
如果想要rollback,
(1)注解上面寫(xiě)明異常類(lèi)型即可,@Transactional(rollbackFor=Exception.class)
(2)在方法上添加 throws Exception,將方法中出現(xiàn)的異常拋出給spring事務(wù)
(3)去掉方法體中的try catch
(4)catch (Exception e) { throw e;}繼續(xù)向上拋,目的是讓spring事務(wù)捕獲這個(gè)異常
除了以上注意的問(wèn)題,說(shuō)一下最近遇到的關(guān)于多數(shù)據(jù)源配置事務(wù)回滾的問(wèn)題
在項(xiàng)目中關(guān)于事務(wù)該配置的也配置了,需要注意的問(wèn)題也注意了,但有的事務(wù)可以出現(xiàn)回滾有的回滾失敗,最終問(wèn)題所在: id相同的事務(wù)配置分別配置在兩個(gè)application.xml文件中,如果多個(gè)application.xml有配置,在web.xml中后加載的application.xml中的事務(wù)配置會(huì)覆蓋最先加的application.xml中的事務(wù)配置。
總結(jié)
到此這篇關(guān)于Java當(dāng)中讓事務(wù)回滾的幾種方式的文章就介紹到這了,更多相關(guān)Java事務(wù)回滾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
hibernate 命名查詢(xún)?nèi)绾螌?shí)現(xiàn)
Hibernate允許在映射文件中定義字符串形式的查詢(xún)語(yǔ)句,這種查詢(xún)方式成為命名查詢(xún),需要的朋友可以參考下2012-11-11java 實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)輸出隨機(jī)圖片實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-06-06Java?中的?getDeclaredFields()使用與原理解析
在Java反射機(jī)制中,getDeclaredFields()用于獲取類(lèi)的所有字段,包括私有字段,通過(guò)反射,可以在運(yùn)行時(shí)動(dòng)態(tài)地獲取類(lèi)的信息并操作其成員,本文詳細(xì)介紹了getDeclaredFields()的使用方法、工作原理以及最佳實(shí)踐,涵蓋了反射的基本概念、使用場(chǎng)景和注意事項(xiàng),感興趣的朋友一起看看吧2025-01-01微信公眾帳號(hào)開(kāi)發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例
本篇文章主要介紹了微信公眾帳號(hào)開(kāi)發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解
這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-0120秒教你學(xué)會(huì)java?List函數(shù)排序操作示例
這篇文章主要為大家介紹了20秒教你學(xué)會(huì)List函數(shù)排序操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java中的HashSet與 == 和 equals的區(qū)別示例解析
HashSet是Java中基于哈希表實(shí)現(xiàn)的集合類(lèi),特點(diǎn)包括:元素唯一、無(wú)序和可包含null,本文給大家介紹java中的HashSet與 == 和 equals的區(qū)別,感興趣的朋友一起看看吧2025-02-02Springboot實(shí)現(xiàn)圖片上傳功能的示例代碼
本篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)圖片上傳功能,文中通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-09-09SpringBoot 在測(cè)試時(shí)如何指定包的掃描范圍
這篇文章主要介紹了SpringBoot 在測(cè)試時(shí)如何指定包的掃描范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11