Spring事務的傳播機制


Spring提供了事務的注解
屬性propagation [ˌprɒpə'ɡeɪʃ(ə)n] 傳播
一共有7種事務傳播機制
下面通過a.save()調用b.save()解釋事務的傳播機制
REQUIRED:(必須的)Spring的默認傳播級別,如果上下文中存在事務則加入當前事務,如果不存在事務則新建事務執行。
PS:a.save和b.save的事務傳播機制都是REQUIRED,b.save的事務是跟着a.save的;若a.save沒有事務,b.save的傳播機制為REQUIRED,則b.save出現異常會回滾
 
SUPPORTS:(支持)如果上下文中存在事務則加入當前事務,如果沒有事務則以非事務方式執行。
PS:若a.save開啟了事務則b.save就有事務,若a.save沒有事務,b.save的事務傳播機制為SUPPORTS,那么b.save也沒有事務-出現異常不會回滾。
 
MANDATORY:([ˈmændətəri] 強制的)該傳播級別要求上下文中必須存在事務,否則拋出異常。
PS:當b.save的事務傳播機制為MANDATORY時,如果a.save不開啟事務,則會拋出下面的異常
 
REQUIRES_NEW:(開啟新的事務)該傳播級別每次執行都會創建新事務,並同時將上下文中的事務掛起,執行完當前線程后再恢復上下文中事務。(子事務的執行結果不影響父事務的執行和回滾)
PS:當b.save的事務傳播機制為REQUIRES_NEW時,a.save發生異常(a.save會回滾),但是不會影響b.save的事務提交,也就是b.save正常執行;b.save發生了異常,b的事務會回滾,但不會影響a.save的事務
 
NOT_SUPPORTED:(不支持事務)當上下文中有事務則掛起當前事務,執行完當前邏輯后再恢復上下文事務。(降低事務大小,將非核心的執行邏輯包裹執行。)
PS:當a.save開啟事務,b.save的事務傳播機制為NOT_SUPPORTED時,b.save是不支持事務的,b.save發生異常不會回滾,但是不會影響a.save的事務,所以a.save會回滾
 
NEVER:(絕不要事務)該傳播級別要求上下文中不能存在事務,否則拋出異常。
PS:當a.save開啟事務,但是b.save的事務傳播機制為NEVER時,則會拋出下面的異常
 
NESTED:嵌套事務,如果上下文中存在事務則嵌套執行,如果不存在則新建事務。(save point概念)
 
Nested和RequiresNew的區別:
  • RequiresNew每次都創建新的獨立的物理事務,而Nested只有一個物理事務;Nested嵌套事務回滾或提交不會導致外部事務回滾或提交,但外部事務回滾將導致嵌套事務回滾,而RequiresNew由於都是全新的事務,所以之間是無關聯的
  • Nested使用JDBC 3的保存點實現,即如果使用低版本驅動將導致不支持嵌套事務
 
使用嵌套事務,必須確保具體事務管理器實現的nestedTransactionAllowed屬性為true,否則不支持嵌套事務,如DataSourceTransactionManager默認支持,而HibernateTransactionManager默認不支持,需要我們來開啟。
 
Spring 是如何管理事務的?
​ Spring事務管理主要包括3個接口,Spring的事務主要是由它們(PlatformTransactionManager,TransactionDefinition,TransactionStatus)三個共同完成的。
1. PlatformTransactionManager:事務管理器--主要用於平台相關事務的管理
主要有三個方法:
  • commit 事務提交;
  • rollback 事務回滾;
  • getTransaction 獲取事務狀態。
2. TransactionDefinition:事務定義信息--用來定義事務相關的屬性,給事務管理器PlatformTransactionManager使用
這個接口有下面四個主要方法:
  • getIsolationLevel:獲取隔離級別;
  • getPropagationBehavior:獲取傳播行為;
  • getTimeout:獲取超時時間;
  • isReadOnly:是否只讀(保存、更新、刪除時屬性變為false--可讀寫,查詢時為true--只讀)
事務管理器能夠根據這個返回值進行優化,這些事務的配置信息,都可以通過配置文件進行配置。
3. TransactionStatus:事務具體運行狀態--事務管理過程中,每個時間點事務的狀態信息。
例如它的幾個方法:
  • hasSavepoint():返回這個事務內部是否包含一個保存點,
  • isCompleted():返回該事務是否已完成,也就是說,是否已經提交或回滾
  • isNewTransaction():判斷當前事務是否是一個新事務
聲明式事務的優缺點:
  • 優點:不需要在業務邏輯代碼中編寫事務相關代碼,只需要在配置文件配置或使用注解(@Transaction),這種方式沒有侵入性。
  • 缺點:聲明式事務的最細粒度作用於方法上,如果像代碼塊也有事務需求,只能變通下,將代碼塊變為方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM