欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot中@Transactional注解與異常處理機(jī)制方式

 更新時(shí)間:2024年08月06日 11:07:56   作者:HelloBlues  
這篇文章主要介紹了Springboot中@Transactional注解與異常處理機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Springboot @Transactional注解與異常處理機(jī)制

@Transactional注解的方法默認(rèn)會(huì)捕獲所有非檢查異常,即RuntimeException和Error,可以通過(guò)括號(hào)聲明顯示指定處理異常類,如Exception.class

關(guān)于異常處理機(jī)制:

當(dāng)代碼拋出異常時(shí),異常處理的優(yōu)先級(jí)如下:

  • try-catch 塊:如果在代碼中使用了 try-catch 塊來(lái)捕獲異常,異常將會(huì)首先被 try-catch 塊捕獲并處理。只有在 try-catch 塊中未處理(重新拋出)異常時(shí),異常才會(huì)繼續(xù)傳播。
  • @Transactional:如果異常從 try-catch 塊中傳播出來(lái),Spring 的事務(wù)管理器(由 @Transactional 注解管理)會(huì)捕獲異常并決定是否回滾事務(wù)。事務(wù)處理之后,異常繼續(xù)傳播。
  • @ExceptionHandler:最后,異常會(huì)被全局異常處理器(由 @ControllerAdvice 和 @ExceptionHandler 注解管理)捕獲并處理。

因此,對(duì)于手動(dòng)捕獲的異常,需要手動(dòng)將其拋出才會(huì)被@Transactional處理器捕獲,全局處理器的優(yōu)先級(jí)最后,除了特殊的異??赡苄枰{(diào)整傳播順序,大部分不需要考慮其影響。

@Transactional錯(cuò)誤集錦以及如何正確使用

原理

@Transactional 是聲明式事務(wù)管理 編程中使用的注解,通過(guò)Spring AOP在注解修飾方法的前后織入事務(wù)管理的實(shí)現(xiàn)語(yǔ)句,所以開(kāi)發(fā)者只需要通過(guò)一個(gè)注解就能代替一系列繁瑣的事務(wù)開(kāi)始、事務(wù)關(guān)閉等重復(fù)性的編碼任務(wù)。

添加位置

  • 接口實(shí)現(xiàn)類或接口實(shí)現(xiàn)方法上,而不是接口類中。
  • 訪問(wèn)權(quán)限:public 的方法才起作用。@Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上,這是由 Spring AOP 的本質(zhì)決定的。
  • 系統(tǒng)設(shè)計(jì):將標(biāo)簽放置在需要進(jìn)行事務(wù)管理的方法上,而不是放在所有接口實(shí)現(xiàn)類上:只讀的接口就不需要事務(wù)管理,由于配置了@Transactional就需要AOP攔截及事務(wù)的處理,可能影響系統(tǒng)性能。

錯(cuò)誤案例

1.同一個(gè)類中調(diào)用

public class A {
    
    public void methodA() {
        methodB();
        
        // 其他操作
    }

    @Transactional
    public void methodB() {
        // 寫(xiě)數(shù)據(jù)庫(kù)操作
    }
    
}

上面案例是錯(cuò)誤的基于Spring Aop的攔截機(jī)制,將會(huì)忽略事務(wù)。

解決方式如下:

@Service@AllArgsConstructorpublic class A {        private B b;        public void methodA() {        b.methodB();        // 其他操作    }}@Servicepublic class B {
    @Transactional    public void methodB() {        // 寫(xiě)數(shù)據(jù)庫(kù)操作    }    }

注意:這里的B類沒(méi)有用@Autowrire,構(gòu)造函數(shù)用Lombok的@AllArgsConstructor生成 自動(dòng)注入了。

2. @Transactional修飾方法不是public

public class TransactionalMistake {
    
    @Transactional
    private void method() {
        // 寫(xiě)數(shù)據(jù)庫(kù)操作
    }
    
}

這也是基于Spring AOP實(shí)現(xiàn)的注解所要滿足的要求。這個(gè)最簡(jiǎn)單, 直接把方法訪問(wèn)類型改成public即可。

3. 不同的數(shù)據(jù)源

public class TransactionalMistake {

    @Transactional
    public void createOrder(Order order) {
        orderRepo1.save(order);
        orderRepo2.save(order);
    }

}

上面這個(gè)例子里的orderRepo1和orderRepo2是連接的兩個(gè)不同數(shù)據(jù)源。

默認(rèn)情況下,這種跨數(shù)據(jù)源的事務(wù)是不會(huì)成功的。

如果要在多個(gè)數(shù)據(jù)源之間實(shí)現(xiàn)事務(wù),那么可以引入JTA。

4. 回滾異常配置不正確

默認(rèn)情況下,僅對(duì)RuntimeException和Error進(jìn)行回滾。

如果不是的它們及它們的子孫異常的話,就不會(huì)回滾。

如果不是RuntimeException,但也希望觸發(fā)回滾,那么可以使用rollbackFor屬性來(lái)指定要回滾的異常。

public class TransactionalMistake {

    @Transactional(rollbackFor = XXXException.class)
    public void method() throws XXXException {

    }

}

5. 數(shù)據(jù)庫(kù)引擎不支持事務(wù)

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

這里的spring.jpa.database-platform配置主要用來(lái)設(shè)置hibernate使用的方言。

這里特地采用了MySQL5InnoDBDialect,主要為了保障在使用Spring Data JPA時(shí)候,Hibernate自動(dòng)創(chuàng)建表的時(shí)候使用InnoDB存儲(chǔ)引擎,不然就會(huì)以默認(rèn)存儲(chǔ)引擎MyISAM來(lái)建表,而MyISAM存儲(chǔ)引擎是沒(méi)有事務(wù)的。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合log4j2日志的實(shí)現(xiàn)

    SpringBoot整合log4j2日志的實(shí)現(xiàn)

    在項(xiàng)目推進(jìn)中,如果說(shuō)第一件事是搭Spring框架的話,那么第二件事情就是在Sring基礎(chǔ)上搭建日志框架,大家都知道日志對(duì)于一個(gè)項(xiàng)目的重要性,尤其是線上Web項(xiàng)目,因?yàn)槿罩究赡苁俏覀兞私鈶?yīng)用如何執(zhí)行的唯一方式。此篇文章是博主在實(shí)踐中用Springboot整合log4j2日志的總結(jié)
    2021-06-06
  • 詳解JDBC對(duì)Mysql utf8mb4字符集的處理

    詳解JDBC對(duì)Mysql utf8mb4字符集的處理

    這篇文章主要介紹了詳解JDBC對(duì)Mysql utf8mb4字符集的處理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • spring security實(shí)現(xiàn)下次自動(dòng)登錄功能過(guò)程解析

    spring security實(shí)現(xiàn)下次自動(dòng)登錄功能過(guò)程解析

    這篇文章主要介紹了spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 利用Java實(shí)體bean對(duì)象批量數(shù)據(jù)傳輸處理方案小結(jié)

    利用Java實(shí)體bean對(duì)象批量數(shù)據(jù)傳輸處理方案小結(jié)

    javabean是對(duì)面向?qū)ο笏枷氲囊环N具體實(shí)施的表現(xiàn),本文重點(diǎn)給大家介紹利用Java實(shí)體bean對(duì)象批量數(shù)據(jù)傳輸處理方案小結(jié),本文通過(guò)兩種方案給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • JSP 開(kāi)發(fā)之hibernate的hql查詢多對(duì)多查詢

    JSP 開(kāi)發(fā)之hibernate的hql查詢多對(duì)多查詢

    這篇文章主要介紹了JSP 開(kāi)發(fā)之hibernate的hql查詢多對(duì)多查詢的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • IDEA利用自帶Axis工具和wsdl文件反向生成服務(wù)端客戶端代碼圖文詳解

    IDEA利用自帶Axis工具和wsdl文件反向生成服務(wù)端客戶端代碼圖文詳解

    這篇文章主要介紹了IDEA利用自帶Axis工具和wsdl文件反向生成服務(wù)端客戶端代碼詳細(xì)流程,在這里小編使用的是idea2021.1最新開(kāi)發(fā)工具,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-05-05
  • Java創(chuàng)建型設(shè)計(jì)模式之單例模式

    Java創(chuàng)建型設(shè)計(jì)模式之單例模式

    Java單例模式是一種設(shè)計(jì)模式,它確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)??梢允褂枚喾N方式實(shí)現(xiàn)單例模式,如餓漢式、懶漢式、雙重檢查鎖定、靜態(tài)內(nèi)部類、枚舉等,每種方式都有其優(yōu)缺點(diǎn),需要根據(jù)具體情況選擇使用
    2023-05-05
  • Java8深入學(xué)習(xí)系列(一)lambda表達(dá)式介紹

    Java8深入學(xué)習(xí)系列(一)lambda表達(dá)式介紹

    Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式和Stream API,所以我們學(xué)習(xí)java8的第一課就是學(xué)習(xí)lambda表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于Java8學(xué)習(xí)之lambda的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • 簡(jiǎn)單了解Java synchronized關(guān)鍵字同步

    簡(jiǎn)單了解Java synchronized關(guān)鍵字同步

    這篇文章主要介紹了簡(jiǎn)單了解Java synchronized關(guān)鍵字同步,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java使用JSONPath解析JSON完整內(nèi)容詳解

    Java使用JSONPath解析JSON完整內(nèi)容詳解

    這篇文章主要介紹了Java使用JSONPath解析JSON完整內(nèi)容詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論