最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

大白話解讀Spring事務(wù)傳播原理,讓你事務(wù)管理不再懵逼

2023-05-05 17:47 作者:做架構(gòu)師不做框架師  | 我要投稿


大家好,我是小米,一個熱愛技術(shù)分享的程序員。今天我們來談一下Spring事務(wù)傳播。在使用Spring進行數(shù)據(jù)庫操作時,我們經(jīng)常會遇到需要使用事務(wù)的情況,而Spring對事務(wù)的管理非常方便,其中就包括事務(wù)傳播機制。

什么是事務(wù)傳播

事務(wù)傳播指的是在一個方法調(diào)用另一個方法時,事務(wù)應(yīng)該如何進行傳播。在Spring框架中,事務(wù)傳播有多種策略,它們用于控制不同方法之間事務(wù)的關(guān)系。在使用Spring事務(wù)的時候,我們需要了解這些事務(wù)傳播機制的特點和使用場景,以便更好地控制事務(wù)的傳播和管理。

事務(wù)的不同分類

Spring事務(wù)傳播機制根據(jù)傳播的不同情況,可以分為三類:支持當(dāng)前事務(wù)、不支持當(dāng)前事務(wù)、嵌套事務(wù)。

  • 支持當(dāng)前事務(wù):是指當(dāng)前方法需要在一個事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。如果當(dāng)前存在事務(wù),則沿用當(dāng)前事務(wù)。

  • 不支持當(dāng)前事務(wù):是指當(dāng)前方法需要在沒有事務(wù)的情況下執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù),執(zhí)行當(dāng)前方法,執(zhí)行完畢后再恢復(fù)原先的事務(wù)。

  • 嵌套事務(wù):是指在當(dāng)前事務(wù)中開啟一個新的事務(wù),這個新的事務(wù)可以看做是當(dāng)前事務(wù)的子事務(wù)。如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。


事務(wù)的傳播方式

Spring事務(wù)的傳播方式用的比較多的是以下三種:

  • Required(默認(rèn)):表示當(dāng)前方法必須在一個事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則新開啟一個事務(wù),如果當(dāng)前存在事務(wù),則沿用當(dāng)前事務(wù)。它是Spring事務(wù)傳播機制的默認(rèn)選項。這種事務(wù)傳播機制的使用場景是:多個操作需要在同一事務(wù)中進行,例如對訂單進行下單和扣款操作。

  • Requires_new:表示當(dāng)前方法必須在一個新的事務(wù)中執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù),開啟新的事務(wù),執(zhí)行完畢后再恢復(fù)原先的事務(wù)。這種事務(wù)傳播機制的使用場景是:需要將當(dāng)前事務(wù)掛起,執(zhí)行獨立的操作,例如對商品進行庫存調(diào)整和日志記錄。

  • Nested:表示當(dāng)前方法必須在一個嵌套事務(wù)中執(zhí)行,如果當(dāng)前沒有事務(wù),則新開啟一個事務(wù),如果當(dāng)前存在事務(wù),則在當(dāng)前事務(wù)的基礎(chǔ)上創(chuàng)建一個嵌套事務(wù)。這種事務(wù)傳播機制的使用場景是:需要對當(dāng)前事務(wù)進行子事務(wù)的操作,例如對訂單進行部分退款操作。

需要注意的是,Nested只在當(dāng)前事務(wù)是一個真正的事務(wù)時才有效,如果當(dāng)前事務(wù)并不是一個真正的事務(wù)(例如使用TransactionDefinition.PROPAGATION_NOT_SUPPORTED或TransactionDefinition.PROPAGATION_NEVER時),Nested和Required的效果是一樣的。

除了上述傳播方式外,Spring還支持其他的傳播方式,例如supports、not_supported、mandatory、never等,它們的作用和含義可以根據(jù)具體的業(yè)務(wù)場景進行選擇和使用。


判斷內(nèi)外方法是否在同一事務(wù)

在使用Spring事務(wù)時,我們需要注意內(nèi)部方法和外部方法是否在同一個事務(wù)中

  • 如果內(nèi)部方法和外部方法在同一個事務(wù)中,那么當(dāng)內(nèi)部方法發(fā)生異常時,外部方法也會受到影響,此時需要將異常統(tǒng)一在外層處理。

  • 如果內(nèi)部方法和外部方法不在同一個事務(wù)中,那么內(nèi)部方法的異常不會影響到外部方法,但是外部方法的異常可能會影響到內(nèi)部方法。

  • 然而,Nested有一個特殊情況,即當(dāng)內(nèi)部方法使用Nested傳播機制時,內(nèi)部方法和外部方法不在同一個事務(wù)中,但是內(nèi)部方法的異常仍然會影響到外部方法。


案例:內(nèi)外方法在同一個事務(wù)

為了更好地理解Spring事務(wù)的傳播機制,我們可以通過一個簡單的電商項目來演示上述三種情況。

在該電商項目中,我們有兩個Service,一個是OrderService,一個是GoodsService。OrderService負(fù)責(zé)生成訂單,而GoodsService負(fù)責(zé)扣減庫存。兩個Service中都有一個reduceStock方法,用來扣減庫存。在扣減庫存的同時,我們還需要判斷庫存是否充足。如果庫存不足,我們需要拋出一個RuntimeException。

首先,我們來看一下內(nèi)部方法和外部方法在同一個事務(wù)中的情況。在這種情況下,我們可以使用required傳播機制。具體實現(xiàn)如下:

在這個例子中,如果庫存不足,會拋出一個RuntimeException,整個事務(wù)會回滾。如果扣減庫存失敗,同樣會拋出一個RuntimeException,整個事務(wù)也會回滾。如果訂單生成成功,整個事務(wù)會被提交。


案例:內(nèi)外方法不在同一個事務(wù)

接下來,我們來看一下內(nèi)部方法和外部方法不在同一個事務(wù)中的情況。在這種情況下,我們可以使用requires_new傳播機制。具體實現(xiàn)如下:

在這個例子中,我們將reduceStock方法的事務(wù)傳播機制設(shè)置為REQUIRES_NEW。在執(zhí)行該方法時,Spring會將當(dāng)前事務(wù)掛起,創(chuàng)建一個新的事務(wù)來執(zhí)行reduceStock方法。如果reduceStock方法執(zhí)行成功,則會提交新的事務(wù)。如果reduceStock方法執(zhí)行失敗,則會回滾新的事務(wù),但不會影響當(dāng)前事務(wù)。

在這個例子中,我們將需要扣減的庫存數(shù)量加了1。這樣在扣減庫存時,就會發(fā)現(xiàn)庫存不足。此時,reduceStock方法會拋出一個RuntimeException,新的事務(wù)會回滾,但當(dāng)前事務(wù)不會受到影響。因此,訂單生成成功,但庫存并沒有被扣減。


嵌套事務(wù)

最后,我們來看一下嵌套事務(wù)的情況。在這種情況下,我們可以使用nested傳播機制。具體實現(xiàn)如下:

在這個例子中,我們將reduceStock方法的事務(wù)傳播機制設(shè)置為NESTED。在執(zhí)行該方法時,Spring會創(chuàng)建一個嵌套事務(wù)來執(zhí)行reduceStock方法。如果reduceStock方法執(zhí)行成功,則嵌套事務(wù)會提交。如果reduceStock方法執(zhí)行失敗,則嵌套事務(wù)會回滾,但不會影響外層事務(wù)。

在這個例子中,我們在createOrder方法中調(diào)用了reduceStock方法,并將需要扣減的庫存數(shù)量加了2。這樣在扣減庫存時,就會發(fā)現(xiàn)庫存不足。此時,reduceStock方法會拋出一個RuntimeException,嵌套事務(wù)會回滾,但當(dāng)前事務(wù)不會受到影響。因此,訂單生成失敗,庫存也沒有被扣減。


結(jié)論

綜上所述,Spring事務(wù)傳播機制提供了靈活的事務(wù)管理方式,可以根據(jù)不同的業(yè)務(wù)場景選擇不同的傳播機制來控制事務(wù)的行為。其中,REQUIRES_NEW和NESTED是比較特殊的傳播機制,可以在需要的時候使用。

在使用Spring事務(wù)時,需要注意以下幾點:

  • 事務(wù)傳播機制的選擇要根據(jù)業(yè)務(wù)場景來確定。

  • 如果內(nèi)層方法和外層方法在同一個事務(wù)中,那么內(nèi)層方法拋出異常時,異常應(yīng)該由外層方法來處理。

  • 如果內(nèi)層方法和外層方法在不同的事務(wù)中,那么內(nèi)層方法拋出異常時,不會影響到外層方法。

  • NESTED傳播機制是一種比較特殊的傳播機制,需要慎重使用。

在實際開發(fā)中,我們需要根據(jù)不同的業(yè)務(wù)場景選擇合適的事務(wù)傳播機制,并且要根據(jù)實際情況來處理事務(wù)異常,以保證事務(wù)的正確執(zhí)行。


END

如有疑問或者更多的技術(shù)分享,歡迎關(guān)注我的微信公眾號“知其然亦知其所以然”!





大白話解讀Spring事務(wù)傳播原理,讓你事務(wù)管理不再懵逼的評論 (共 條)

分享到微博請遵守國家法律
竹山县| 酉阳| 贵德县| 贺州市| 盐亭县| 准格尔旗| 博乐市| 当雄县| 本溪| 青铜峡市| 鄂伦春自治旗| 乐安县| 玉树县| 天等县| 红桥区| 柯坪县| 安宁市| 微山县| 富阳市| 电白县| 玉树县| 清水县| 嘉义市| 集贤县| 铜川市| 大同市| 武邑县| 东乡县| 宣武区| 庆安县| 旌德县| 剑川县| 微博| 扶余县| 青州市| 专栏| 新竹县| 赤城县| 吉林省| 河北省| 宝鸡市|