事務處理的完成有兩種情況,即回滾事務或者提交事務。
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、事務資源清理。