一、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