Spring框架事務管理機制源碼分析:rollback和commit


事務處理的完成有兩種情況,即回滾事務或者提交事務。

AbstractPlatformTransactionManager提供的rollback(TransactionStatus)和commit(TransactionStatus)兩個模板方法,分別對應這兩種情況的處理。

在事務處理過程中,我們可以通過TransactionStatus的setRollbackOnly方法標記事務回滾,所以commit(TransactionStatus)在具體提交事務之前會檢查rollBackOnly狀態,如果該狀態被設置,則轉而執行事務的回滾操作。

rollback(TransactionStatus var1) 的邏輯主要包含以下3點:

1、回滾事務

  • 如果是嵌套事務,則通過TransactionStatus釋放Savepoint。
  • 如果TransactionStatus表示當前事務是一個新事務,則調用子類的doRollback(TransactionStatus)方法真正的回滾事務。doRollback(TransactionStatus)是抽象方法,子類必須去實現它。
  • 如果當前存在事務,並且rollbackOnly狀態被設置,則調用由子類實現的doSetRollbackOnly(TransactionStatus)方法,各子類實現通常會將當前的transaction object 狀態設置成rollBackOnly

2、觸發Synchronization事件

3、清理事務資源:

  • 設置TransactionStatus中的completed為完成狀態
  • 清理當前事務相關的Synchronization
  • 調用doCleanupAfterCompletion()釋放事務資源,並解除到Transaction SynchronizationManager的資源綁定。對於DataSourceTransactionManager來說,是關閉數據庫連接,然后解除對DataSource對應資源的綁定。
  • 如果之前有掛起的事務恢復事務的掛起。

 

commit:

在事務處理過程中,我們可以通過TransactionStatus的setRollbackOnly方法標記事務回滾,所以commit(TransactionStatus)在具體提交事務之前會檢查rollBackOnly狀態,如果該狀態沒有被設置,則執行正常的事務提交操作。

提交事務時,會涉及如下幾種情況:

1、提交事務事務時

  • 決定是否提前檢測全局的rollBackOnly標志。如果最外層事務已經被標記為rollBackOnly,並且failEarlyOnGlobalRollBackOnly為true,則拋出異常。
  • 如果提交事務之前發現TransactionStatus持有Savapoint,則釋放它。這實際上是在處理嵌套事務的提交。
  • 如果TransactionStatus表示要提交的事務是一個新事務,則調用子類的doCommit(TransactionStatus)方法實現提交事務

2、觸發Synchronization相關事件

3、如果AbstractPlatformTransactionManager的rollbackOnCommitFailure 狀態被設置成true,則表示如果在事務提交過程中出現異常,需要回滾事務。即當commit方法捕獲到異常,並且檢測到該字段被設置的時候,需要回滾事務。反之如果被設置為false,則出現異常也不回滾。

4、事務資源清理。


免責聲明!

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



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