Spring事務管理接口:PlatformTransactionManager、TransactionDefinition和TransactionStatus


Spring 的事務管理是基於 AOP 實現的,而 AOP 是以方法為單位的。Spring 的事務屬性分別為傳播行為、隔離級別、只讀和超時屬性,這些屬性提供了事務應用的方法和描述策略。

Java EE 開發經常采用的分層模式中,Spring 的事務處理位於業務邏輯層,它提供了針對事務的解決方案。

在 Spring 解壓包的 libs 目錄中,包含一個名稱為 spring-tx-3.2.13.RELEASE.jar 的文件,該文件是 Spring 提供的用於事務管理的 JAR 包,其中包括事務管理的三個核心接口:PlatformTransactionManager、TransactionDefinition 和 TransactionStatus。

1. PlatformTransactionManager

PlatformTransactionManager 接口是 Spring 提供的平台事務管理器,用於管理事務。該接口中提供了三個事務操作方法,具體如下。

  • TransactionStatus getTransaction(TransactionDefinition definition):用於獲取事務狀態信息。
  • void commit(TransactionStatus status):用於提交事務。
  • void rollback(TransactionStatus status):用於回滾事務。


在項目中,Spring 將 xml 中配置的事務詳細信息封裝到對象 TransactionDefinition 中,然后通過事務管理器的 getTransaction() 方法獲得事務的狀態(TransactionStatus),並對事務進行下一步的操作。

2. TransactionDefinition

TransactionDefinition 接口是事務定義(描述)的對象,它提供了事務相關信息獲取的方法,其中包括五個操作,具體如下。

  • String getName():獲取事務對象名稱。
  • int getIsolationLevel():獲取事務的隔離級別。
  • int getPropagationBehavior():獲取事務的傳播行為。
  • int getTimeout():獲取事務的超時時間。
  • boolean isReadOnly():獲取事務是否只讀。


在上述五個方法的描述中,事務的傳播行為是指在同一個方法中,不同操作前后所使用的事務。傳播行為的種類如表 1 所示。

表 1 傳播行為的種類
屬性名稱 描  述
PROPAGATION_REQUIRED required 支持當前事務。如果 A 方法已經在事務中,則 B 事務將直接使用。否則將創建新事務
PROPAGATION_SUPPORTS supports 支持當前事務。如果 A 方法已經在事務中,則 B 事務將直接使用。否則將以非事務狀態執行
PROPAGATION_MANDATORY mandatory 支持當前事務。如果 A 方法沒有事務,則拋出異常
PROPAGATION_REQUIRES_NEW requires_new 將創建新的事務,如果 A 方法已經在事務中,則將 A 事務掛起
PROPAGATION_NOT_SUPPORTED not_supported 不支持當前事務,總是以非事務狀態執行。如果 A 方法已經在事務中,則將其掛起
PROPAGATION_NEVER never 不支持當前事務,如果 A 方法在事務中,則拋出異常
PROPAGATION.NESTED nested 嵌套事務,底層將使用 Savepoint 形成嵌套事務


在事務管理過程中,傳播行為可以控制是否需要創建事務以及如何創建事務。

通常情況下,數據的查詢不會改變原數據,所以不需要進行事務管理,而對於數據的增加、修改和刪除等操作,必須進行事務管理。如果沒有指定事務的傳播行為,則 Spring3 默認的傳播行為是 required。

3. TransactionStatus

TransactionStatus 接口是事務的狀態,它描述了某一時間點上事務的狀態信息。其中包含六個操作,具體如表 2 所示。

表 2  事務的操作
名稱 說明
void flush() 刷新事務
boolean hasSavepoint() 獲取是否存在保存點
boolean isCompleted() 獲取事務是否完成
boolean isNewTransaction() 獲取是否是新事務
boolean isRollbackOnly() 獲取是否回滾
void setRollbackOnly() 設置事務回滾

 

 
private PlatformTransactionManager transactionManager;
TransactionDefinition definition = new DefaultTransactionDefinition(
TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transaction = transactionManager.getTransaction(definition);
transactionManager.commit(transaction);


免責聲明!

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



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