国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring事務(wù)傳播機(jī)制

這篇具有很好參考價(jià)值的文章主要介紹了Spring事務(wù)傳播機(jī)制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.Spring對(duì)事物的支持一般有兩種方式

  • 編程式事務(wù)管理:通過(guò)?TransactionTemplate或者TransactionManager手動(dòng)管理事務(wù),實(shí)際應(yīng)用中很少使用,這不是本文的重點(diǎn),就不在這里贅述。

  • 聲明式事務(wù)管理:使用場(chǎng)景最多,也是最推薦使用的方式,直接加上@Transactional注解即可。

2.Transactional注解幾大參數(shù)解釋

@Transactional 注解是用于聲明事務(wù)性方法的注解,通常用于標(biāo)記在服務(wù)層的方法上。該注解提供了一些參數(shù),用于配置事務(wù)的一些屬性。以下是幾個(gè)常用的參數(shù)及其解釋?zhuān)?/p>

  • propagation(傳播行為):
  • - 用于指定事務(wù)的傳播行為。包括諸如 `REQUIRED`、`REQUIRES_NEW`、`SUPPORTS`、`NOT_SUPPORTED` 等。該參數(shù)定義了方法被嵌套調(diào)用時(shí),事務(wù)如何傳播。
  • 2. isolation(隔離級(jí)別):
  • - 用于指定事務(wù)的隔離級(jí)別。包括 `DEFAULT`、`READ_UNCOMMITTED`、`READ_COMMITTED`、`REPEATABLE_READ`、`SERIALIZABLE`。該參數(shù)定義了事務(wù)處理過(guò)程中對(duì)數(shù)據(jù)的隔離程度。
  • 3. readOnly(只讀):
  • - 用于指定事務(wù)是否是只讀的。如果設(shè)置為 `true`,表示只讀取數(shù)據(jù)而不修改,可以優(yōu)化事務(wù)處理。默認(rèn)值為 `false`。
  • 4. timeout`(超時(shí)時(shí)間):
  • - 用于指定事務(wù)的超時(shí)時(shí)間,單位為秒。如果事務(wù)執(zhí)行時(shí)間超過(guò)指定的時(shí)間,則會(huì)被強(qiáng)制回滾。默認(rèn)值為 `-1`,表示沒(méi)有超時(shí)限制。
  • 5. rollbackFor` 和 noRollbackFor:
  • - 用于指定在哪些異常情況下回滾事務(wù)。`rollbackFor` 指定哪些異常時(shí)回滾,`noRollbackFor` 指定哪些異常時(shí)不回滾??梢詡魅氘惓n?lèi)型的數(shù)組

?重點(diǎn)講解propagation(傳播行為)

七大參數(shù)設(shè)置:?

Spring事務(wù)傳播機(jī)制

?場(chǎng)景:

假設(shè)有這樣的場(chǎng)景 有A類(lèi)和B類(lèi) A類(lèi)內(nèi)部有一個(gè)事務(wù)方法 B類(lèi)有一個(gè)事務(wù)方法

class A{
    public B b;
    @Transactional
    public void a(){
        //1.對(duì)數(shù)據(jù)表A進(jìn)行插入操作方法
        System.out.println("往A插入數(shù)據(jù)");
        //2.對(duì)數(shù)據(jù)表B進(jìn)行插入操作方法
        b.b();
        //
        System.out.println("往A繼續(xù)插入數(shù)據(jù)");
    }
}

class B{
    @Transactional
    public void b(){
        //對(duì)數(shù)據(jù)庫(kù)進(jìn)行插入操作方法
        System.out.println("更新表單 插入數(shù)據(jù)");
    }
}

這種是一種常見(jiàn)的嵌套事務(wù) 如果都存在事務(wù)可能它的SQL是這樣的

BEGIN
 UPDATE A;
    -- B類(lèi)的事務(wù)來(lái)了
    BEGIN
    UPDATE B;
    COMMIT;
    --     
UPDATE A;
COMMIT;

這種寫(xiě)法在MYSQL是不支持的,如果執(zhí)行了B事務(wù)那么A的部門(mén)事務(wù)失效。如果想要實(shí)現(xiàn)這兩個(gè)事務(wù)都存在怎么辦?那我們可以直接把B事務(wù)的BEGIN和COMMIT去掉 讓B事務(wù)融入到A事務(wù)中即可。

BEGIN
 UPDATE A;
    -- B類(lèi)的事務(wù)來(lái)了
    UPDATE B;
    --     
UPDATE A;
COMMIT;

這種情況其實(shí)就代表了傳播行為的?REQUIRED 傳播行為

具體來(lái)說(shuō),當(dāng)一個(gè)方法使用?@Transactional(propagation = Propagation.REQUIRED)?進(jìn)行標(biāo)記時(shí),它的行為如下:

  1. 存在事務(wù)時(shí):?方法將在當(dāng)前事務(wù)中運(yùn)行,與調(diào)用該方法的外部事務(wù)合并為一個(gè)事務(wù)。

  2. 不存在事務(wù)時(shí):?方法將啟動(dòng)一個(gè)新的事務(wù)。

這種情況會(huì)出現(xiàn)一個(gè)問(wèn)題 就是外部的事務(wù)融入到當(dāng)前事務(wù)中的時(shí)候如果出錯(cuò)那么整個(gè)事務(wù)都會(huì)進(jìn)行回滾。

解決這種情況有一個(gè)名詞叫掛起 掛起解釋就是使用其他線程獲取不同的數(shù)據(jù)庫(kù)連接 如果執(zhí)行兩個(gè)不同的事務(wù) 這樣就不會(huì)影響原本事務(wù)的流程。

-- 線程1獲取到數(shù)據(jù)庫(kù)連接1 執(zhí)行A事務(wù)的流程
BEGIN
 UPDATE A;
    -- B類(lèi)的事務(wù)來(lái)了 線程2獲取到數(shù)據(jù)庫(kù)連接2 執(zhí)行B事務(wù)的流程
    BEGIN
    UPDATE B;
    COMMIT;
    --  執(zhí)行后 重新將線程B切換到線程A 來(lái)執(zhí)行后續(xù)流程
UPDATE A;
COMMIT;

這種情況也是傳播行為中的REQUIRES_NEW?傳播行為

具體來(lái)說(shuō),當(dāng)一個(gè)方法使用?@Transactional(propagation = Propagation.REQUIRES_NEW)?進(jìn)行標(biāo)記時(shí),它的行為如下:

  1. 存在事務(wù)時(shí):?方法將掛起當(dāng)前的事務(wù),并啟動(dòng)一個(gè)新的事務(wù)。在該方法執(zhí)行完畢后,新事務(wù)將被提交或回滾,然后恢復(fù)掛起的事務(wù)。

  2. 不存在事務(wù)時(shí):?方法將啟動(dòng)一個(gè)新的事務(wù)。

還有一種情況就是嵌套事務(wù),MySQL是不支持嵌套事務(wù)的,但Mybatis在這個(gè)層面加入了保存點(diǎn)和回滾點(diǎn)來(lái)支持。

BEGIN
    UPDATE a set score=100 where id=1;
    Savepoint a;
    update b set score=200 where id=2;
    ROLLBACK to a;
--     如果B事務(wù)出現(xiàn)問(wèn)題 不會(huì)影響后面的事務(wù)
        UPDATE a set score=300 where id=3;
COMMIT;

當(dāng)一個(gè)方法使用?@Transactional(propagation = Propagation.NESTED)?進(jìn)行標(biāo)記時(shí),它的行為如下:

  1. 存在事務(wù)時(shí):?方法將在一個(gè)嵌套事務(wù)中運(yùn)行。如果當(dāng)前存在事務(wù),則將創(chuàng)建一個(gè)新的保存點(diǎn),并在方法執(zhí)行時(shí)將該保存點(diǎn)設(shè)為當(dāng)前事務(wù)的回滾點(diǎn)。如果方法執(zhí)行后,嵌套事務(wù)回滾,則只會(huì)回滾到該保存點(diǎn),而不會(huì)影響外部事務(wù)。

  2. 不存在事務(wù)時(shí):?方法將啟動(dòng)一個(gè)新的事務(wù),行為與?REQUIRED?類(lèi)似。

上面三種情況其實(shí)就能解決掉百分之99%的事務(wù)嵌套問(wèn)題,Spring為我們提供了七個(gè)事務(wù)傳播行為,解釋后四個(gè)

  • SUPPORTS:支持當(dāng)前事務(wù),B事務(wù)設(shè)置了這個(gè)傳播行為,如果A有事務(wù)就融入到A事務(wù)中,如果沒(méi)有就不開(kāi)啟事務(wù),這個(gè)使用場(chǎng)景適用于只讀和只有多SELECT場(chǎng)景下。
  • ?MANDATORY:只支持當(dāng)前事務(wù),B事務(wù)如果設(shè)置了這個(gè)傳播行為,那么它必須要被傳入到一個(gè)有事務(wù)的方法中,不然就會(huì)拋出異常。
  • NOT_SUPPORTED:不支持事務(wù),如果B事務(wù)設(shè)置了這個(gè)傳播行為,那么它如果被傳入到A事務(wù)方法內(nèi),那么它會(huì)將A事務(wù)進(jìn)行掛起已非事務(wù)的方法來(lái)運(yùn)行。
  • NEVER:不支持事務(wù),只要有事務(wù)運(yùn)行,就直接拋出異常。

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-794665.html

到了這里,關(guān)于Spring事務(wù)傳播機(jī)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring事務(wù)傳播機(jī)制解析

    在Java的Spring框架中,事務(wù)管理是保證應(yīng)用數(shù)據(jù)一致性和可靠性的關(guān)鍵。Spring提供了靈活的事務(wù)傳播機(jī)制,它定義了事務(wù)邊界,以及在嵌套方法調(diào)用時(shí)如何處理事務(wù)。本文旨在深入探討Spring的事務(wù)傳播行為,幫助開(kāi)發(fā)者更好地理解和運(yùn)用這一重要特性。 事務(wù)傳播機(jī)制指的是在

    2024年01月16日
    瀏覽(35)
  • spring的事務(wù)傳播機(jī)制

    spring的事務(wù)傳播機(jī)制

    嫌棄內(nèi)容代碼復(fù)雜的可直接看思維導(dǎo)圖大綱即可 指的就是當(dāng)一個(gè)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),這個(gè)事務(wù)方法應(yīng)該如何進(jìn)行 默認(rèn),當(dāng)前存在事務(wù),則加入該事務(wù);不存在事務(wù),創(chuàng)建新事務(wù)。 始終以新的事務(wù)運(yùn)行,當(dāng)前存在事務(wù),則掛起原事務(wù);不存在事務(wù),創(chuàng)建新事務(wù)

    2023年04月23日
    瀏覽(39)
  • Spring事務(wù)傳播機(jī)制

    Spring事務(wù)傳播機(jī)制

    編程式事務(wù)管理:通過(guò)? TransactionTemplate 或者 TransactionManager 手動(dòng)管理事務(wù),實(shí)際應(yīng)用中很少使用,這不是本文的重點(diǎn),就不在這里贅述。 聲明式事務(wù)管理:使用場(chǎng)景最多,也是最推薦使用的方式,直接加上@Transactional注解即可。 @Transactional 注解是用于聲明事務(wù)性方法的注解

    2024年01月16日
    瀏覽(42)
  • 【JavaEE進(jìn)階】Spring事務(wù)和事務(wù)傳播機(jī)制

    【JavaEE進(jìn)階】Spring事務(wù)和事務(wù)傳播機(jī)制

    Spring 事務(wù)是 Spring 框架提供的一種機(jī)制,用于 管理數(shù)據(jù)庫(kù)操作或其他資源的一組相關(guān)操作 ,以確保它們?cè)谝粋€(gè)原子、一致、可靠和隔離的執(zhí)行單元內(nèi)進(jìn)行。事務(wù)用于維護(hù)數(shù)據(jù)的完整性并支持并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)的數(shù)據(jù)一致性。 Spring 事務(wù)的主要特點(diǎn)包括: 原子性(Atomicity):

    2024年02月09日
    瀏覽(22)
  • 一文詳解Spring事務(wù)傳播機(jī)制

    一文詳解Spring事務(wù)傳播機(jī)制

    目錄 背景 Spring事務(wù) @Transactional注解 使用場(chǎng)景 失效場(chǎng)景 原理 常用參數(shù) 注意 事務(wù)傳播機(jī)制 處理嵌套事務(wù)流程 主事務(wù)為REQUIRED子事務(wù)為REQUIRED 主事務(wù)為REQUIRED子事務(wù)為REQUIRES_NEW 主事務(wù)為REQUIRED子事務(wù)為NESTED 實(shí)現(xiàn)方式 源碼解析 我們?cè)谑褂肧pring管理數(shù)據(jù)庫(kù)事務(wù)的時(shí)候很方便,只

    2023年04月26日
    瀏覽(21)
  • 【Spring】深入理解 Spring 事務(wù)及其傳播機(jī)制

    【Spring】深入理解 Spring 事務(wù)及其傳播機(jī)制

    在 Spring 框架中,事務(wù)(Transaction)是一種用于管理數(shù)據(jù)庫(kù)操作的機(jī)制,旨在 確保數(shù)據(jù)的 一致性、可靠性和完整性 。事務(wù)可以將一組數(shù)據(jù)庫(kù)操作(如插入、更新、刪除等)視為一個(gè)單獨(dú)的執(zhí)行單元,要么 全部成功地執(zhí)行,要么全部回滾 。這樣可以確保數(shù)據(jù)庫(kù)在任何時(shí)候都保

    2024年02月12日
    瀏覽(30)
  • Spring @Transactional事務(wù)傳播機(jī)制詳解

    我們?nèi)粘9ぷ髦袠O少使用事務(wù)傳播級(jí)別,單純只是使用事務(wù)和rollbackfor拋出異常來(lái)解決事務(wù)問(wèn)題,但其實(shí)我們很多時(shí)候使用的是不正確的,或者說(shuō)會(huì)造成事務(wù)粒度過(guò)大,本文詳解一下事務(wù)傳播級(jí)別,也讓自己更好地處理事務(wù)問(wèn)題。 1.什么是事務(wù)傳播機(jī)制? 舉個(gè)栗子,方法A是一

    2024年02月14日
    瀏覽(25)
  • Spring事務(wù)傳播的7種機(jī)制

    Spring事務(wù)傳播的7種機(jī)制

    1. Propagation.REQUIRED:默認(rèn)的事務(wù)傳播級(jí)別,它表示如果當(dāng)前存在事務(wù),則加入該事務(wù);如果 當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。 2. Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的 方式繼續(xù)運(yùn)行。 3. Propagation.MANDATORY:(mandatory:強(qiáng)制

    2024年02月09日
    瀏覽(25)
  • spring事務(wù)管理詳解和實(shí)例(事務(wù)傳播機(jī)制、事務(wù)隔離級(jí)別)

    spring事務(wù)管理詳解和實(shí)例(事務(wù)傳播機(jī)制、事務(wù)隔離級(jí)別)

    目錄 1 理解spring事務(wù) 2 核心接口 2.1 事務(wù)管理器 2.1.1 JDBC事務(wù) 2.1.2 Hibernate事務(wù) 2.1.3 Java持久化API事務(wù)(JPA) 2.2 基本事務(wù)屬性的定義 2.2.1 傳播行為 2.2.2 隔離級(jí)別 2.2.3 只讀 2.2.4 事務(wù)超時(shí) 2.2.5 回滾規(guī)則 2.3 事務(wù)狀態(tài) 3?編程式事務(wù) 3.1 編程式和聲明式事務(wù)的區(qū)別 3.2 如何實(shí)現(xiàn)編程式

    2024年02月06日
    瀏覽(21)
  • 【掌握Spring事務(wù)管理】深入理解事務(wù)傳播機(jī)制的秘密

    【掌握Spring事務(wù)管理】深入理解事務(wù)傳播機(jī)制的秘密

    ?????? 點(diǎn)進(jìn)來(lái)你就是我的人了 博主主頁(yè): ?????? 戳一戳,歡迎大佬指點(diǎn)! 歡迎志同道合的朋友一起加油喔 ?????? 目錄 1.Spring 中事務(wù)的實(shí)現(xiàn)方式 1.1 Spring 編程式事務(wù) (了解) 1.2 Spring 聲明式事務(wù) ( @Transactional ) 【異常情況一】(自動(dòng)回滾成功) 【異常情況二】(自動(dòng)回滾失效

    2024年02月10日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包