Spring對事務的支援
- 2019 年 10 月 4 日
- 筆記
上幾篇中我們主要介紹了有關資料庫事務相關的知識,在這一篇中,我們將重點了解一下,在spring中是怎麼對事務進行支援的。在其它的文章中我們知道spring DAO為了支援不同的持久化技術,於是提供了模板類的方式使之支援不同的持久化技術,那麼spring的事務管理也是一樣的,它也是採用了這種方式,於是就提供了 TransactionTemplate模板類。在spring中我們可以使用TransactionTemplate模板類,及事務回調TransactionCallback就可以通過編碼的方式實現事務管理,並且無須關注資源獲取、釋放、事務同步和異常處理等操作。
spring事務管理的好處是聲明式事務管理,也就是說可以通過IOC配置中指定邊界和事務屬性,這樣spring會自動在指定的事務邊界上應用事務屬性。
在spring的事務管理中,主要有3個介面,他們分別是:PlatformTransactionManager、TransactionDefinition、TransactionStatus。他們3個具體的關聯關係如下:
下面我們詳細了解一下上面3個介面的具體作用。
TransactionDefinition:用戶描述事務的隔離級別、超時時間、是否為只讀事務和事務傳播規則等控制事務具體行為的事務屬性。PlatformTransactionManager根據TransactionDefinition提供的事務屬性配置資訊創建事務,並用TransactionStatus描述這個事務的激活事務的狀態。在上面我們介紹過TransactionDefinition用來描述事務的相關屬性,那麼下面我們具體看一下在TransactionDefinition中都包括哪些事務屬性。
- 事務隔離:當前事務和其它事務的隔離程度。在TransactionDefinition中定義了和java.sql.Connection介面中一樣的隔離級別:ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_REPEATABLE_READ、ISOLATION_SERIALIZABLE。上面介紹的這些常量正好對應在其它文章中提到過的資料庫的隔離級別。除此之外TransactionDefinition還包括默認的隔離級別ISOLATION_DEFAULT。它表示使用底層資料庫的默認隔離級別。
- 事務傳播:在正常的情況下事務中執行的所有程式碼都會在一個事務中運行,但spring為我們提供了幾種可選的事務傳播類型:簡單的參與到現有的事務中、或者掛起當前事務、或者創建一個新的事務。
- 事務超時:事務在超時前能運行多久,超過時間後,事務將回滾。
- 只讀狀態:因為只讀事務不修改任何數據,所以在有隻讀操作時可以對只讀事務做優化處理,提高運行性能。
TransactionStatus:TransactionStatus表示的是事務的具體運行狀態。也就是通過TransactionStatus可以獲取到事務運行期的狀態資訊,也可以通過該介面間接的回滾事務。這是因為該介面繼承了SavepointManager,而SavepointManager介面又支援JDBC3.0中新增的保存點的分段事務控制能力。下面我們簡單了解一下SavepointManager中所包括的方法。
- Object createSavepoint():創建一個保存點對象,以保證事務可以支援回滾到保存點上,也可以調用releaseSavepoint()方法釋放一個已經確定不用的保存點。
- void rollbackToSavepoint(Object var1):將事務回滾到特定的保存點上,被回滾的保存點將自動釋放。
- void releaseSavepoint(Object var1):釋放一個保存點,如果事務提交,那麼所有的保存點都將釋放。
除了上述已有的方法外,TransactionStatus還擴展了以下SavepointManager中沒有的方法:
- boolean hasSavepoint():判斷當前事務是否創建了保存點。
- boolean isNewTransaction():判斷當前事務是否是一個新的事務,如果返回false則表示當前事務是一個已經存在的事務,或者當前操作未運行在事務環境中。
- boolean isCompleted():判斷當前事務是否已經結束,已經提交事務或者事務回滾都任務當前事務已經結束。
- boolean isRollbackOnly():判斷當前事務是否已經被標識為rollback-only。
- void setRollbackOnly():將當前事務設置為rollback-only。通過該標識spring將此事務回滾。
PlatformTransactionManager:在其它的文章中使我們知道JDBC的事務只能提交或者回滾。在spring中PlatformTransactionManager的作用就是做上述功能的。下面我們看一下PlatformTransactionManager中的所涉及到的方法及其作用。
- TransactionStatus getTransaction(TransactionDefinition var1):該方法根據事務定義的資訊從事務環境中返回一個已存在的事務,或者創建一個新的事務,並用TransactionStatus記錄這個事務的運行狀態。
- void commit(TransactionStatus var1):根據事務的狀態提交事務,如果事務已經被標識為rollback-only,則該方法將執行回滾操作。
- void rollback(TransactionStatus var1):將事務回滾,如果調用commit()方法拋出一異常時,則spring會默認調用rollback()方法。
上面我們介紹了spring中有關事務的主要介面,下面我們繼續了解一下,在spring中這些介面的具體實現,實際上spring為不同的持久化技術都提供了不同的實現,相關的實現類如下:
spring就是通過這此實現類進而實現spring對事務的管理的,介紹了這麼多,我們來看一下在spring中到底怎麼用程式碼的方式也就是聲明式事務管理。



這樣我們的數據源就支援事務管理了。