1. 程式人生 > >《Spring揭祕》讀書筆記四:統一事務管理

《Spring揭祕》讀書筆記四:統一事務管理

一、背景和支撐

事務程式碼混在業務程式碼之中,不便於維護。基於上一章介紹的 AOP可以想到,通過AOP的方式 將 Spring事務從 業務程式碼中剝離出來。 

自己實現的話:宣告一個註解,然後通過 AOP的  @annoation的 Pointcut 為 帶有 自定義註解的方法 加入事務邏輯即可。

二、Spring 統一的方式

事務有多種實現,Spring 統一抽象出了 PlatformTransactionManager,然後 根據具體的使用場景提供具體的 實現即可。

圖來自《Spring揭祕》

總體上使用 策略模式,具體實現類上 使用了 模板方法模式。

AbstractPlatformTransactionManager編寫出了通用的事務模板,大體按照如下步驟: 

1、檢查當前是否存在事務

2、根據 Transaction中的 傳播行為 做出相應的舉動

3、提交前檢查 TransactionStatus 中的 RollBackOnly狀態,判斷是否需要用 回滾代替提交

4、回滾後,清理並恢復事務裝填

三、具體使用

程式設計式和宣告式

宣告式,除了加上 @Transactional註解之外, 還需要提供 具體的 PlatformTransactionManager,Spring boot 會 自動為我們註冊到容器,不用我們做額外的處理。

四、ThreadLocal

JDBC事務基於 Connection,所以 一次事務中的 所有資料操作都需要使用 同一個 Connection,如果在多個方法之間進行 Connection的傳遞,方法的複用性和耦合性無疑很差。

此時, 我們可以使用 ThreadLocal的方式,將Connection物件繫結到執行緒中,這樣 各個方法直接從執行緒中獲取 Connection即可。

ThreadLocal的原理:實際的內容是 儲存在 Thead物件的 ThreadLocalMap之中, ThreadLocal物件只是作為儲存時的 key而已。

常見的使用場景:

1、諸如 SimpleDateFormat之類的 執行緒不安全的物件,不可以作為類變數共享於各個例項之間,可以 通過 ThreadLocal構造執行緒的私有變數,每個執行緒都持有一個 獨立的物件,可以保證執行緒安全性。

2、執行緒安全的物件,宣告為 一個類變數在 多個執行緒之間共享,多個執行緒發生競爭有可能造成 效能的損失。此時,我們也可以 構造執行緒私有變數來提高效能。

3、可以使用 ThreadLocal 將資料繫結到執行緒,以比較解耦的方式傳遞在各個方法間 傳遞資料。但是此種方法需要注意的是:

要適時的 繫結以及解綁。原因在於,框架中普遍使用 執行緒池技術,執行緒是一直存在的,可能造成資料的混亂,需要在一開始繫結資料,流程結束了 記得 清空資料。