最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中propagation的7種事務(wù)配置及說明

 更新時間:2021年06月17日 11:08:13   作者:格子間里格子衫  
這篇文章主要介紹了Spring中propagation的7種事務(wù)配置及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring propagation7種事務(wù)配置

1、簡述

在聲明式的事務(wù)處理中,要配置一個切面,其中就用到了propagation,表示打算對這些方法怎么使用事務(wù),是用還是不用,其中propagation有七種配置,REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。默認(rèn)是REQUIRED。

2、Spring中七種Propagation類的事務(wù)屬性詳解:

REQUIRED:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個事務(wù)。這是最常見的選擇。

SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。

MANDATORY:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

REQUIRES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

NESTED:支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)存在,則執(zhí)行一個嵌套事務(wù),如果當(dāng)前沒有事務(wù),就新建一個事務(wù)。

3、注意事項

這些配置將影響數(shù)據(jù)存儲,必須根據(jù)情況選擇。

@Transactional事務(wù)幾點注意及其屬性Propagation的使用

@Transactional事務(wù)幾點注意

這里面有幾點需要大家留意:

A. 一個功能是否要事務(wù),必須納入設(shè)計、編碼考慮。不能僅僅完成了基本功能就ok。

B. 如果加了事務(wù),必須做好開發(fā)環(huán)境測試(測試環(huán)境也盡量觸發(fā)異常、測試回滾),確保事務(wù)生效。

C. 以下列了事務(wù)使用過程的注意事項,請大家留意。

1. 不要在接口上聲明@Transactional ,而要在具體類的方法上使用 @Transactional 注解,否則注解可能無效。

2.不要圖省事,將@Transactional放置在類級的聲明中,放在類聲明,會使得所有方法都有事務(wù)。故@Transactional應(yīng)該放在方法級別,不需要使用事務(wù)的方法,就不要放置事務(wù),比如查詢方法。否則對性能是有影響的。

3.使用了@Transactional的方法,對同一個類里面的方法調(diào)用, @Transactional無效。比如有一個類Test,它的一個方法A,A再調(diào)用Test本類的方法B(不管B是否public還是private),但A沒有聲明注解事務(wù),而B有。則外部調(diào)用A之后,B的事務(wù)是不會起作用的。(經(jīng)常在這里出錯)

4.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他類調(diào)用才有效,故只能是public。道理和上面的有關(guān)聯(lián)。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不會報錯,但事務(wù)無效。

5.經(jīng)過在ICORE-CLAIM中測試,效果如下:

A.拋出受查異常XXXException,事務(wù)會回滾。

B.拋出運行時異常NullPointerException,事務(wù)會回滾。

C.Quartz中,execute直接調(diào)用加了@Transactional方法,可以回滾;間接調(diào)用,不會回滾。(即上文3點提到的)

D.異步任務(wù)中,execute直接調(diào)用加了@Transactional方法,可以回滾;間接調(diào)用,不會回滾。(即上文3點提到的)

E.在action中加上@Transactional,不會回滾。切記不要在action中加上事務(wù)。

F.在service中加上@Transactional,如果是action直接調(diào)該方法,會回滾,如果是間接調(diào),不會回滾。(即上文3提到的)

G.在service中的private加上@Transactional,事務(wù)不會回滾。

其屬性Propagation的使用:

Spring Transaction中有一個很重要的屬性:Propagation。主要用來配置當(dāng)前需要執(zhí)行的方法,與當(dāng)前是否有transaction之間的關(guān)系。

我曉得有點兒抽象,這也是為什么我想要寫這篇博客的原因??戳撕竺娴睦?,大家應(yīng)該就明白了。

一、Propagation取值:

REQUIRED(默認(rèn)值):在有transaction狀態(tài)下執(zhí)行;如當(dāng)前沒有transaction,則創(chuàng)建新的transaction;

SUPPORTS:如當(dāng)前有transaction,則在transaction狀態(tài)下執(zhí)行;如果當(dāng)前沒有transaction,在無transaction狀態(tài)下執(zhí)行;

MANDATORY:必須在有transaction狀態(tài)下執(zhí)行,如果當(dāng)前沒有transaction,則拋出異常IllegalTransactionStateException;

REQUIRES_NEW:創(chuàng)建新的transaction并執(zhí)行;如果當(dāng)前已有transaction,則將當(dāng)前transaction掛起;

NOT_SUPPORTED:在無transaction狀態(tài)下執(zhí)行;如果當(dāng)前已有transaction,則將當(dāng)前transaction掛起;

NEVER:在無transaction狀態(tài)下執(zhí)行;如果當(dāng)前已有transaction,則拋出異常IllegalTransactionStateException。

二、REQUIRED與REQUIRED_NEW

上面描述的6種propagation屬性配置中,最難以理解,并且容易在transaction設(shè)計時出現(xiàn)問題的是REQUIRED和REQURED_NEW這兩者的區(qū)別。當(dāng)程序在某些情況下拋出異常時,如果對于這兩者不夠了解,就可能很難發(fā)現(xiàn)而且解決問題。

下面我們給出三個場景進行分析:

場景一:

ServiceA.java:
 public class ServiceA {
     @Transactional
     public void callB() {
         serviceB.doSomething();
     }
 }
 ServiceB.java
 public class ServiceB {
     @Transactional
     public void doSomething() {
         throw new RuntimeException("B throw exception");
     }
 }

這種情況下,我們只需要在調(diào)用ServiceA.callB時捕獲ServiceB中拋出的運行時異常,則transaction就會正常的rollback。

場景二

在保持場景一中ServiceB不變,在ServiceA中調(diào)用ServiceB的doSomething時去捕獲這個異常,如下:

 public class ServiceA {
     @Transactional
     public void callB() {
         try {
             serviceB.doSomething();
         } catch (RuntimeException e) {
             System.err.println(e.getMessage());
         }
     }
 }

這個時候,我們再調(diào)用ServiceA的callB。程序會拋出org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only這樣一個異常信息。原因是什么呢?

因為在ServiceA和ServiceB中的@Transactional propagation都采用的默認(rèn)值:REQUREID。

根據(jù)我們前面講過的REQUIRED特性,當(dāng)ServiceA調(diào)用ServiceB的時候,他們是處于同一個transaction中。

如下圖所示:

當(dāng)ServiceB中拋出了一個異常以后,ServiceB會把當(dāng)前的transaction標(biāo)記為需要rollback。

但是ServiceA中捕獲了這個異常,并進行了處理,認(rèn)為當(dāng)前transaction應(yīng)該正常commit。

此時就出現(xiàn)了前后不一致,也就是因為這樣,拋出了前面的UnexpectedRollbackException。

場景三

在保持場景二中ServiceA不變,修改ServiceB中方法的propagation配置為REQUIRES_NEW,如下:

 public class ServiceB {
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void doSomething() {
         throw new RuntimeException("B throw exception");
     }
 }

此時,程序可以正常的退出了,也沒有拋出UnexpectedRollbackException。原因是因為當(dāng)ServiceA調(diào)用ServiceB時,serviceB的doSomething是在一個新的transaction中執(zhí)行的。

如下圖所示:

所以,當(dāng)doSomething拋出異常以后,僅僅是把新創(chuàng)建的transaction rollback了,而不會影響到ServiceA的transaction。

ServiceA就可以正常的進行commit。

當(dāng)然這里把ServiceA和ServiceB放在兩個獨立的transaction是否成立,還需要再多多考慮你的業(yè)務(wù)需求。

Transaction不是一個新東西了,那對于transaction的使用會不會有一些模式?一些經(jīng)驗之談呢?答案肯定是有的,以后再說。

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

相關(guān)文章

  • springboot filter實現(xiàn)請求響應(yīng)全鏈路攔截

    springboot filter實現(xiàn)請求響應(yīng)全鏈路攔截

    這篇文章主要為大家詳細介紹了SpringBoot如何結(jié)合Filter同時攔截請求和響應(yīng),從而實現(xiàn)??日志采集自動化,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Spring?AOP底層原理及代理模式

    Spring?AOP底層原理及代理模式

    這篇文章主要為大家介紹了Spring?AOP底層原理及代理模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 詳解Spring mvc DispatchServlet 實現(xiàn)機制

    詳解Spring mvc DispatchServlet 實現(xiàn)機制

    本篇文章主要介紹了詳解Spring mvc DispatchServlet 實現(xiàn)機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 使用Zookeeper實現(xiàn)分布式鎖

    使用Zookeeper實現(xiàn)分布式鎖

    這篇文章主要介紹了使用Zookeeper實現(xiàn)分布式鎖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • springmvc級聯(lián)屬性處理無法轉(zhuǎn)換異常問題解決

    springmvc級聯(lián)屬性處理無法轉(zhuǎn)換異常問題解決

    這篇文章主要介紹了springmvc級聯(lián)屬性處理無法轉(zhuǎn)換異常問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Springboot打成war包并在tomcat中運行的部署方法

    Springboot打成war包并在tomcat中運行的部署方法

    這篇文章主要介紹了Springboot打成war包并在tomcat中運行,在文中還給大家介紹了SpringBoot war包tomcat運行啟動報錯(Cannot determine embedded database driver class for database type NONE)的解決方法,需要的朋友可以參考下
    2018-01-01
  • Springboot基于maven打包分離lib及resource

    Springboot基于maven打包分離lib及resource

    這篇文章主要介紹了Springboot基于maven打包分離lib及resource,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java的MyBatis框架中XML映射緩存的使用教程

    Java的MyBatis框架中XML映射緩存的使用教程

    MyBatis程序在做好XML映射后能夠有緩存的功能,這樣映射過SQL語句的配置以后就可以拿過來直接用了,這里我們來一起總結(jié)一下Java的MyBatis框架中XML映射緩存的使用教程
    2016-06-06
  • Java的字節(jié)緩沖流與字符緩沖流解析

    Java的字節(jié)緩沖流與字符緩沖流解析

    這篇文章主要介紹了Java的字節(jié)緩沖流與字符緩沖流解析,Java 緩沖流是Java I/O庫中的一種流,用于提高讀寫數(shù)據(jù)的效率,它通過在內(nèi)存中創(chuàng)建緩沖區(qū)來減少與底層設(shè)備的直接交互次數(shù),從而減少了I/O操作的開銷,需要的朋友可以參考下
    2023-11-11
  • Java數(shù)組的去重

    Java數(shù)組的去重

    這篇文章主要介紹了Java數(shù)組去重,結(jié)合實例形式分析了Java針對數(shù)組的去重,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10

最新評論

桦甸市| 枣强县| 清水河县| 九江市| 民权县| 嵊泗县| 昌吉市| 神池县| 奉节县| 苗栗县| 汶上县| 安西县| 凤台县| 昆山市| 凤城市| 辽阳市| 大厂| 高尔夫| 吉木乃县| 全南县| 乡宁县| 香港 | 内黄县| 黑山县| 深州市| 板桥市| 吉隆县| 广东省| 南乐县| 石台县| 宕昌县| 察雅县| 余姚市| 大渡口区| 金乡县| 乌兰察布市| 通山县| 乾安县| 天门市| 禄丰县| 徐水县|