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

Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法

 更新時(shí)間:2020年05月22日 16:02:14   作者:WaterMin  
這篇文章主要介紹了Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

@Transactional 內(nèi)部調(diào)用例子 🌰

在 Spring 的 AOP 代理下,只有目標(biāo)方法由外部調(diào)用,目標(biāo)方法才由 Spring 生成的代理對(duì)象來管理,這會(huì)造成自調(diào)用問題。
若同一類中的其他沒有@Transactional 注解的方法內(nèi)部調(diào)用有@Transactional 注解的方法,有@Transactional 注解的方法的事務(wù)被忽略,不會(huì)發(fā)生回滾

@Service
public class A{
  
  public void action(){
    dosome();
  }
  
  @Transactional
  public void dosome(){
    doa.insert(new Object());
  }
}

如上代碼,在方法dosome()中拋出異常時(shí),數(shù)據(jù)操作不會(huì)回滾

解決方案

思路: 強(qiáng)制使用 AspectJ 對(duì)方法進(jìn)行切面

Springboot 引入 AspectJ 切面

pom.xml 中添加AspectJ:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.5</version>
</dependency>

啟動(dòng)類中添加 @EnableAspectJAutoProxy(exposeProxy = true)

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
public class DonngPartsApplication {

  public static void main(String[] args) {
    SpringApplication.run(DonngPartsApplication.class, args);
  }

}

注意: exposeProxy = true 若不添加,則會(huì)報(bào):

java.lang.IllegalStateException:

Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available,

and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.

代碼中 ((A) AopContext.currentProxy()).dosome()

修改為如下代碼,事務(wù)就生效啦

@Service
public class A{
  
  public void action(){
    ((A) AopContext.currentProxy()).dosome();
  }
  
  @Transactional
  public void dosome(){
    doa.insert(new Object());
  }
}

@Transactional 進(jìn)階

1. @Transactional 注解的屬性信息

屬性 描述
name 當(dāng)在配置文件中有多個(gè) TransactionManager , 可以用該屬性指定選擇哪個(gè)事務(wù)管理器
propagation 事務(wù)的傳播行為,默認(rèn)值為 REQUIRED
isolation 事務(wù)的隔離度,默認(rèn)值采用 DEFAULT
timeout 事務(wù)的超時(shí)時(shí)間,默認(rèn)值為-1。如果超過該時(shí)間限制但事務(wù)還沒有完成,則自動(dòng)回滾事務(wù)
read-only 指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true
rollback-for 用于指定能夠觸發(fā)事務(wù)回滾的異常類型,如果有多個(gè)異常類型需要指定,各類型之間可以通過逗號(hào)分隔
no-rollback- for 拋出 no-rollback-for 指定的異常類型,不回滾事務(wù)

2. propagation 傳播行為

  • REQUIRED:如果有事務(wù), 那么加入事務(wù), 沒有的話新建一個(gè)(默認(rèn)情況下)
  • NOT_SUPPORTED:容器不為這個(gè)方法開啟事務(wù)
  • REQUIRES_NEW:不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù)
  • MANDATORY:必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常
  • NEVER:必須在一個(gè)沒有的事務(wù)中執(zhí)行,否則拋出異常(與MANDATORY相反)
  • SUPPORTS:如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒有聲明事務(wù),那就不用事務(wù).
  • NESTED: 如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則進(jìn)行與PROPAGATION_REQUIRED類似的操作。

3. 事物超時(shí)設(shè)置
@Transactional(timeout=30) //默認(rèn)是30秒

4. 事務(wù)隔離級(jí)別 isolation

  • READ_UNCOMMITTED:讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀) 基本不使用
  • READ_COMMITTED:讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
  • REPEATABLE_READ:可重復(fù)讀(會(huì)出現(xiàn)幻讀)
  • SERIALIZABLE:串行化

注意

@Transactional 只能被應(yīng)用到public方法上

僅僅 @Transactional 注解的出現(xiàn)不足于開啟事務(wù)行為,它僅僅 是一種元數(shù)據(jù)

到此這篇關(guān)于Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法的文章就介紹到這了,更多相關(guān)Java注解@Transactional調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus批量更新太慢該如何解決詳解

    mybatis-plus批量更新太慢該如何解決詳解

    這篇文章主要給大家介紹了關(guān)于mybatis-plus批量更新太慢該如何解決的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • SpringBoot開發(fā)實(shí)戰(zhàn)之自動(dòng)配置

    SpringBoot開發(fā)實(shí)戰(zhàn)之自動(dòng)配置

    SpringBoot的核心就是自動(dòng)配置,自動(dòng)配置又是基于條件判斷來配置Bean,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開發(fā)實(shí)戰(zhàn)之自動(dòng)配置的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java中private關(guān)鍵字詳細(xì)用法實(shí)例以及解釋

    Java中private關(guān)鍵字詳細(xì)用法實(shí)例以及解釋

    這篇文章主要給大家介紹了關(guān)于Java中private關(guān)鍵字詳細(xì)用法實(shí)例以及解釋的相關(guān)資料,在Java中private是一種訪問修飾符,它可以用來控制類成員的訪問權(quán)限,文中將用法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Hutool是一個(gè)Java基礎(chǔ)工具類,對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化

    在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化

    這篇文章主要介紹了在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化的方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • Java設(shè)計(jì)模式之裝飾者模式詳解

    Java設(shè)計(jì)模式之裝飾者模式詳解

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之裝飾者模式,裝飾者模式是一種結(jié)構(gòu)式模式,感興趣的朋友可以參考一下
    2021-10-10
  • java并發(fā)等待條件的實(shí)現(xiàn)原理詳解

    java并發(fā)等待條件的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了java并發(fā)等待條件的實(shí)現(xiàn)原理詳解,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • SpringBoot與Spring之間的對(duì)比

    SpringBoot與Spring之間的對(duì)比

    這篇文章主要介紹了SpringBoot與Spring之間的對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    這篇文章主要為大家介紹了Java內(nèi)存管理垃圾回收基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 解析maven的用法和幾個(gè)常用的命令(推薦)

    解析maven的用法和幾個(gè)常用的命令(推薦)

    maven最大的作用就是用于對(duì)項(xiàng)目中jar包依賴的統(tǒng)一管理。這篇文章主要介紹了maven的用法和幾個(gè)常用的命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論