Spring事務傳播機制深度解析

一、Spring事務傳播機制有哪些

Spring事務傳播機制是指在多個事務方法相互調用的場景下,各方法之間事務如何進行傳播和協作的機制。

常見的事務傳播機制包括:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // do something
}

二、Spring事務傳播機制例題詳解

下面來看一個例子,有三個方法methodA、methodB、methodC,其中methodB由methodA調用,methodC由methodB調用,都開啟了事務傳播機制,並且都拋出了異常。

在這種情況下,Spring事務傳播機制會怎麼樣呢?

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // do something
    methodC();
    throw new RuntimeException();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodC() {
    // do something
    throw new RuntimeException();
}

首先,如果methodA或methodB的事務提交失敗,就會回滾整個事務。如果methodC的事務提交失敗,只會回滾methodC的事務,不會影響methodA和methodB的事務。

其次,當methodA調用methodB時,methodA的事務將成為methodB事務的一部分,並且在methodB返回時一併提交。所以,如果methodA和methodB都拋出了異常時,methodA的事務將被回滾,而methodB的事務不會影響到methodA。

最後,當methodB調用methodC時,由於methodC開啟了一個新的事務,所以methodB的事務將被掛起,並且methodB的事務和methodC的事務沒有直接關聯。如果methodB拋出了異常時,只會回滾methodB的事務。如果methodC拋出了異常時,會回滾methodC的事務,並將異常拋給methodB。

三、Spring事務傳播機制實現原理

spring事務的實現原理主要是通過aop來實現。spring通過動態代理對方法進行包裝,在方法調用前後加入開啟和提交事務的操作。

在調用具有事務屬性的方法時,spring會創建一個TransactionInfo對象,用來記錄方法的事務屬性。然後,spring會根據事務屬性來判斷當前事務是否存在,如果不存在,則創建一個新的事務,並將其保存在TransactionSynchronizationManager中,以便後續操作。

如果當前事務已經存在,則根據當前事務的傳播屬性來判斷是否需要開啟新的事務。如果需要開啟新的事務,則創建一個新的事務,並將其保存在TransactionSynchronizationManager中。否則,直接使用當前事務。

在方法執行結束後,spring會根據事務的提交情況來判斷是否需要提交或回滾事務。如果方法拋出了異常,則會回滾事務,否則提交事務。

四、Spring事務傳播機制和隔離級別

Spring事務傳播機制和隔離級別是兩個獨立的概念,但是它們常常一起使用來保障數據的一致性和完整性。

事務的隔離級別是指多個並發事務之間的隔離程度,常見的隔離級別包括:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。

在Spring事務傳播中,通過使用TransactionDefinition接口來定義事務的隔離級別。

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void methodA() {
    // do something
}

五、Spring事務傳播機制面試題

以下是一些常見的關於Spring事務傳播機制的面試題:

1. Spring默認的事務傳播方式是什麼?

2. Spring事務傳播機制和事務隔離級別有什麼區別?

3. Spring事務失效的場景有哪些?

4. Spring的事務管理是如何實現的?

六、Spring默認事務傳播機制

在spring中,默認的事務傳播方式是PROPAGATION_REQUIRED。

PROPAGATION_REQUIRED是指如果當前已經存在事務,則加入這個事務,否則開啟一個新的事務。

PROPAGATION_REQUIRED是默認的事務傳播方式,也是最常用的事務傳播方式。在大多數情況下,我們不需要對其進行額外的配置。

七、Spring事務傳播方式

以下是spring事務傳播方式的一些常用示例:

1. PROPAGATION_REQUIRED:如果當前已經存在事務,則加入這個事務,否則開啟一個新的事務。

2. PROPAGATION_SUPPORTS:如果當前已經存在事務,則加入這個事務,否則以非事務的方式運行。

3. PROPAGATION_MANDATORY:如果當前已經存在事務,則加入這個事務,否則拋出異常。

4. PROPAGATION_REQUIRES_NEW:無論當前是否存在事務,都開啟一個新的事務。

5. PROPAGATION_NOT_SUPPORTED:以非事務的方式運行,如果當前已經存在事務,則掛起該事務。

6. PROPAGATION_NEVER:以非事務的方式運行,如果當前已經存在事務,則拋出異常。

7. PROPAGATION_NESTED:如果當前已經存在事務,則在當前事務中開啟一個嵌套事務,否則開啟一個新的事務。

八、Spring事務傳播屬性有哪些

在定義事務傳播方式時,還可以指定一些屬性來更好地控制事務的行為。

以下是一些常用的事務傳播屬性:

1. readOnly:標識當前事務是否為只讀事務。

2. timeout:指定當前事務的超時時間,單位為秒。

3. rollbackFor:指定哪些異常需要回滾事務。

4. noRollbackFor:指定哪些異常不需要回滾事務。

5. value、transactionManager:指定事務管理器的名稱。

九、Spring事務傳播機制生效條件

在使用Spring事務傳播機制時,需要注意以下幾點:

1. 所有的事務傳播方式都必須在同一個事務管理器中生效,否則無法實現事務傳播。

2. 當前方法必須是public方法,並且不能被static修飾。

3. 事務傳播方式的生效要求當前方法處於被spring管理的bean中,而不是靜態方法中。

以上是關於Spring事務傳播機制的詳細介紹,希望對大家有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/244077.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:00
下一篇 2024-12-12 13:00

相關推薦

發表回復

登錄後才能評論