成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
Spring事務(wù)傳播機(jī)制提供了靈活的事務(wù)管理方式,可以根據(jù)不同的業(yè)務(wù)場(chǎng)景選擇不同的傳播機(jī)制來控制事務(wù)的行為。其中,REQUIRES_NEW和NESTED是比較特殊的傳播機(jī)制,可以在需要的時(shí)候使用。

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

什么是事務(wù)傳播

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

事務(wù)的不同分類

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

支持當(dāng)前事務(wù):是指當(dāng)前方法需要在一個(gè)事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(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ù)中開啟一個(gè)新的事務(wù),這個(gè)新的事務(wù)可以看做是當(dāng)前事務(wù)的子事務(wù)。如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。

事務(wù)的傳播方式

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

  • Required(默認(rèn)):表示當(dāng)前方法必須在一個(gè)事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則新開啟一個(gè)事務(wù),如果當(dāng)前存在事務(wù),則沿用當(dāng)前事務(wù)。它是Spring事務(wù)傳播機(jī)制的默認(rèn)選項(xiàng)。這種事務(wù)傳播機(jī)制的使用場(chǎng)景是:多個(gè)操作需要在同一事務(wù)中進(jìn)行,例如對(duì)訂單進(jìn)行下單和扣款操作。
  • Requires_new:表示當(dāng)前方法必須在一個(gè)新的事務(wù)中執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù),開啟新的事務(wù),執(zhí)行完畢后再恢復(fù)原先的事務(wù)。這種事務(wù)傳播機(jī)制的使用場(chǎng)景是:需要將當(dāng)前事務(wù)掛起,執(zhí)行獨(dú)立的操作,例如對(duì)商品進(jìn)行庫(kù)存調(diào)整和日志記錄。
  • Nested:表示當(dāng)前方法必須在一個(gè)嵌套事務(wù)中執(zhí)行,如果當(dāng)前沒有事務(wù),則新開啟一個(gè)事務(wù),如果當(dāng)前存在事務(wù),則在當(dāng)前事務(wù)的基礎(chǔ)上創(chuàng)建一個(gè)嵌套事務(wù)。這種事務(wù)傳播機(jī)制的使用場(chǎng)景是:需要對(duì)當(dāng)前事務(wù)進(jìn)行子事務(wù)的操作,例如對(duì)訂單進(jìn)行部分退款操作。

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

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

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

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

  • 如果內(nèi)部方法和外部方法在同一個(gè)事務(wù)中,那么當(dāng)內(nèi)部方法發(fā)生異常時(shí),外部方法也會(huì)受到影響,此時(shí)需要將異常統(tǒng)一在外層處理。
  • 如果內(nèi)部方法和外部方法不在同一個(gè)事務(wù)中,那么內(nèi)部方法的異常不會(huì)影響到外部方法,但是外部方法的異常可能會(huì)影響到內(nèi)部方法。
  • 然而,Nested有一個(gè)特殊情況,即當(dāng)內(nèi)部方法使用Nested傳播機(jī)制時(shí),內(nèi)部方法和外部方法不在同一個(gè)事務(wù)中,但是內(nèi)部方法的異常仍然會(huì)影響到外部方法。

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

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

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

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

圖片

圖片

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

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

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

圖片

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

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

嵌套事務(wù)

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

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

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

結(jié)論

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

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

  • 事務(wù)傳播機(jī)制的選擇要根據(jù)業(yè)務(wù)場(chǎng)景來確定。
  • 如果內(nèi)層方法和外層方法在同一個(gè)事務(wù)中,那么內(nèi)層方法拋出異常時(shí),異常應(yīng)該由外層方法來處理。
  • 如果內(nèi)層方法和外層方法在不同的事務(wù)中,那么內(nèi)層方法拋出異常時(shí),不會(huì)影響到外層方法。
  • NESTED傳播機(jī)制是一種比較特殊的傳播機(jī)制,需要慎重使用。

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

責(zé)任編輯:武曉燕 來源: 知其然亦知其所以然
相關(guān)推薦

2009-02-11 13:08:29

事務(wù)提交事務(wù)管理Spring

2009-02-11 11:14:31

事務(wù)管理事務(wù)開始Spring

2025-02-21 08:00:00

事務(wù)管理SpringBootJava

2023-10-08 08:28:10

Spring事務(wù)管理

2009-06-17 14:57:11

Spring事務(wù)管理

2009-06-30 16:57:42

Spring事務(wù)管理

2009-06-08 17:56:00

SpringJDBC事務(wù)

2023-03-27 10:40:09

2020-02-04 15:00:25

大白話認(rèn)識(shí)JVM

2014-08-25 09:12:47

Spring事務(wù)管理

2024-06-05 06:51:11

2010-03-29 13:34:15

ibmdwSpring

2009-09-25 12:59:53

Hibernate事務(wù)

2010-03-23 08:46:40

Spring

2023-12-26 18:22:05

RocketMQ延遲消息

2019-08-14 09:13:38

中臺(tái)互聯(lián)網(wǎng)業(yè)務(wù)

2018-11-19 08:34:22

Hadoop架構(gòu)HDFS

2021-03-01 18:38:32

Mock測(cè)試軟件

2023-10-30 07:36:19

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

2009-06-17 14:43:47

Spring框架Spring事務(wù)管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕爱爱视频 | 青青草一区 | 亚洲视频三区 | 亚洲欧美日韩久久 | 91在线中文字幕 | 国产精品视频一区二区三区四蜜臂 | 欧美国产一区二区 | 午夜日韩精品 | 中文成人在线 | 欧美精品久久久久久久久老牛影院 | 亚洲伊人久久综合 | 国产男女视频 | 午夜午夜精品一区二区三区文 | 在线观看中文字幕视频 | 国产欧美一区二区三区在线播放 | 国产欧美一区二区三区免费 | 玖玖视频免费 | 91精品国产综合久久久久久 | 黄色大片免费播放 | 99热精品久久 | 国产一区日韩在线 | 亚洲天堂一区 | 久久不射电影网 | 欧美激情视频一区二区三区免费 | 欧美日韩在线一区二区 | 91精品国产91久久久久久吃药 | 亚洲国产精品久久 | 五月天综合网 | 成年人国产在线观看 | 一区在线播放 | 精品欧美一区二区三区久久久 | 亚洲欧美日韩一区 | 极品国产视频 | 日韩中文在线观看 | 午夜一区 | 一区精品视频在线观看 | 日日日操 | 欧美日韩久久 | 久草在线 | 日韩国产一区 | 天堂资源最新在线 |