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

解決SpringBoot中使用@Transactional注解遇到的問(wèn)題

 更新時(shí)間:2021年09月22日 11:42:26   作者:f0cf20ca7354  
這篇文章主要介紹了SpringBoot中使用@Transactional注解遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用@Transactional注解遇到的問(wèn)題

1、不建議在接口上添加@Transactional注解

一般在service類標(biāo)簽上添加@Transactional即可

2、@Transactional注解

只能應(yīng)用到public可見(jiàn)度的方法上。如果應(yīng)用到protected、private或者package可見(jiàn)度的方法上時(shí),不會(huì)報(bào)錯(cuò),但事務(wù)也不會(huì)起作用

3、默認(rèn)情況下

spring會(huì)對(duì)uncheck異常進(jìn)行事務(wù)回滾的;如果是checked異常則不會(huì)回滾,可添加注解 @Transactional(rollbackFor=Exception.class) 是的checked異?;貪L。

  • uncheck異常:java里面將派生于Error或者RuntimeException(比如空指針,1/0)的異常
  • checked異常:其他繼承自java.lang.Exception得異常統(tǒng)稱為Checked Exception,如IOException、TimeoutException等

4、數(shù)據(jù)庫(kù)引擎需要支持事務(wù)管理

如果是mysql,注意表要使用事務(wù)的引擎,比如innodb,如果是myisam,事務(wù)不會(huì)起作用的

5、同一類中methodA()方法

沒(méi)有@Transactional 注解,在其內(nèi)部調(diào)用有@Transactional 注解的方法,有@Transactional 注解的方法methodB()的事務(wù)被忽略,不會(huì)開(kāi)啟新的事務(wù),也不會(huì)發(fā)生回滾。例如:

@Service
public class TransactionService {
public void methodA(){
    this.methodB();
}
@Transactional
public void methodB(){
}
}

原因:Spring采用動(dòng)態(tài)代理(AOP)實(shí)現(xiàn)對(duì)bean的管理和切片,它為我們的每個(gè)class生成一個(gè)代理對(duì)象。只有在代理對(duì)象之間進(jìn)行調(diào)用時(shí),可以觸發(fā)切面邏輯。在 Spring 的 AOP 代理下,只有目標(biāo)方法由外部調(diào)用,目標(biāo)方法才由 Spring 生成的代理對(duì)象來(lái)管理。

詳解:Spring的事務(wù)管理是通過(guò)AOP實(shí)現(xiàn)的,其AOP的實(shí)現(xiàn)對(duì)于非final類是通過(guò)cglib這種方式,即生成當(dāng)前類的一個(gè)子類作為代理類,然后在調(diào)用其下的方法時(shí),會(huì)判斷這個(gè)方法有沒(méi)有@Transactional注解,如果有的話,則會(huì)開(kāi)啟一個(gè)新的事務(wù),并通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)事務(wù)管理(攔截方法調(diào)用,執(zhí)行事務(wù)等切面)。

當(dāng)methodA()中調(diào)用methodB()時(shí),并不是使用的代理對(duì)象,而是普通的javabean,從而導(dǎo)致this.methodB()時(shí)也不是代碼對(duì)象,從而導(dǎo)致@Transactional失敗,即發(fā)現(xiàn)methodA()上并沒(méi)有@Transactional注解,所以整個(gè)AOP代理過(guò)程(事務(wù)管理)不會(huì)發(fā)生。

解決辦法:

1、把這兩個(gè)方法分開(kāi)到不同的類中;

2、把注解@Transactional加到類名上面去;

3、把注解@Transactional加到methodA()方法上,methodB()不添加注解,在調(diào)用methodB()時(shí)兩個(gè)方法的事務(wù)都會(huì)生效,因?yàn)閙ethodA()默認(rèn)的事務(wù)傳播屬性為PROPAGATION_REQUIRED,此時(shí)methodB()會(huì)加入到methodA()中

@Service
public class TransactionService {
@Transactional
public void methodA(){
    this.methodB();
}
public void methodB(){
}
}

4、獲取本對(duì)象的代理對(duì)象,再進(jìn)行調(diào)用。具體操作如:

  • Spring-content.xml上下文中,增加配置:<aop:aspectj-autoproxy expose-proxy="true"/>
  • 在TransactionService 中,用(transactionService )(AopContext.currentProxy()),獲取到TransactionService 的代理類,再調(diào)用事務(wù)方法,強(qiáng)行經(jīng)過(guò)代理類,激活事務(wù)切面。

springboot 注解transactional失效

1、在方法中捕獲了異常

那么該方法事務(wù)不會(huì)回滾。本類中A方法(有事務(wù)注解)調(diào)用其他類中B方法(有事務(wù)注解,該類在容器中),B方法中捕獲了異常,事務(wù)失效不可以回滾,在B方法中的catch里進(jìn)行異常拋出則可以正?;貪L。

本類中A方法(有事務(wù)注解)調(diào)用其他類中B方法(有事務(wù)注解,該類在容器中),A方法中捕獲了異常,spring事務(wù)機(jī)制檢測(cè)到異常,進(jìn)行回滾。

所以最好在業(yè)務(wù)層catch中拋出異常讓控制層捕獲。

2、spring中事務(wù)是代理模式

在該類中A方法調(diào)用本類中B方法,A方法上沒(méi)有事務(wù)注解,B方法上有事務(wù)注解,則B方法中出現(xiàn)異常,B方法事務(wù)不會(huì)回滾,A方法沒(méi)有事務(wù)注解也不會(huì)回滾。

3、A方法如果有事務(wù)注解

調(diào)用了本類B方法,B方法出現(xiàn)異常也整體可回滾。

4、本類中A方法調(diào)用

其他類中B方法(有事務(wù)注解,該類在容器中),B方法發(fā)生異常,可以回滾。

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

相關(guān)文章

  • IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問(wèn)題的解決辦法

    IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問(wèn)題的解決辦法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問(wèn)題的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 深入探究一下Java中不同的線程間數(shù)據(jù)通信方式

    深入探究一下Java中不同的線程間數(shù)據(jù)通信方式

    這篇文章主要來(lái)和大家一起深入探究一下Java中不同的線程間數(shù)據(jù)通信方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-04-04
  • spring mvc4的日期/數(shù)字格式化、枚舉轉(zhuǎn)換示例

    spring mvc4的日期/數(shù)字格式化、枚舉轉(zhuǎn)換示例

    本篇文章主要介紹了spring mvc4的日期/數(shù)字格式化、枚舉轉(zhuǎn)換示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java中map遍歷方式的選擇問(wèn)題詳解

    Java中map遍歷方式的選擇問(wèn)題詳解

    這篇文章主要介紹了Java中map遍歷方式的選擇問(wèn)題的相關(guān)內(nèi)容,小編覺(jué)得挺不錯(cuò)的,在則里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • Java實(shí)現(xiàn)批量查找與替換Excel文本的思路詳解

    Java實(shí)現(xiàn)批量查找與替換Excel文本的思路詳解

    在 Java 中,可以通過(guò)find和replace的方法來(lái)查找和替換單元格的數(shù)據(jù),下面小編將以Excel文件為例為大家介紹如何實(shí)現(xiàn)Excel文件內(nèi)容的批量替換,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(62)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(62)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-08-08
  • Java的常見(jiàn)熱門ORM框架優(yōu)缺點(diǎn)區(qū)別

    Java的常見(jiàn)熱門ORM框架優(yōu)缺點(diǎn)區(qū)別

    Java?ORM框架是一種用于將Java對(duì)象映射到關(guān)系型數(shù)據(jù)庫(kù)中的工具,使得開(kāi)發(fā)人員能夠通過(guò)對(duì)象操作數(shù)據(jù)庫(kù)而不必直接使用SQL查詢,Java開(kāi)發(fā)變得更加高效和易于維護(hù),選擇適合你的ORM框架是根據(jù)你的需求決定的,比如你的應(yīng)用場(chǎng)景,數(shù)據(jù)結(jié)構(gòu)和技術(shù)水平等
    2024-02-02
  • java 泛型的詳解及實(shí)例

    java 泛型的詳解及實(shí)例

    這篇文章主要介紹了java 泛型的詳解及實(shí)例的相關(guān)資料,希望通過(guò)本文大家能徹底掌握泛型的使用方法,需要的朋友可以參考下
    2017-08-08
  • Java如何實(shí)現(xiàn)單鏈表的增刪改查

    Java如何實(shí)現(xiàn)單鏈表的增刪改查

    這篇文章主要給大家介紹了關(guān)于Java如何實(shí)現(xiàn)單鏈表的增刪改查的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java WeakHashMap案例詳解

    Java WeakHashMap案例詳解

    這篇文章主要介紹了Java WeakHashMap案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論