了解 Spring Framework 的宣告式交易實作

僅僅告訴您使用 @Transactional 註解標註您的類別,並在您的組態中新增 @EnableTransactionManagement,然後期望您了解其運作方式是不夠的。為了提供更深入的理解,本節將在與交易相關問題的背景下,說明 Spring Framework 宣告式交易基礎架構的內部運作方式。

關於 Spring Framework 的宣告式交易支援,最重要的概念是此支援透過 AOP 代理 啟用,並且交易建議由中繼資料(目前為 XML 或基於註解)驅動。AOP 與交易中繼資料的結合產生了一個 AOP 代理,該代理使用 TransactionInterceptor 以及適當的 TransactionManager 實作,來驅動方法調用周圍的交易。

Spring AOP 在 AOP 章節 中涵蓋。

Spring Framework 的 TransactionInterceptor 為命令式和反應式程式設計模型提供交易管理。攔截器透過檢查方法傳回類型來偵測所需的交易管理風格。傳回反應式類型(例如 Publisher 或 Kotlin Flow(或其子類型))的方法符合反應式交易管理的資格。包括 void 在內的所有其他傳回類型都使用命令式交易管理的程式碼路徑。

交易管理風格會影響所需的交易管理器。命令式交易需要 PlatformTransactionManager,而反應式交易則使用 ReactiveTransactionManager 實作。

@Transactional 通常與由 PlatformTransactionManager 管理的線程綁定交易一起使用,將交易公開給目前執行緒中的所有資料存取操作。注意:這不會傳播到方法內新啟動的執行緒。

ReactiveTransactionManager 管理的反應式交易使用 Reactor context 而不是線程本地屬性。因此,所有參與的資料存取操作都需要在同一個反應式管線中的同一個 Reactor context 內執行。

當配置了 ReactiveTransactionManager 時,所有以交易劃分的方法都應傳回反應式管線。Void 方法或常規傳回類型需要與常規 PlatformTransactionManager 關聯,例如,透過對應的 @Transactional 宣告的 transactionManager 屬性。

下圖顯示了在交易代理上呼叫方法的概念視圖

tx