理解 Spring 框架的宣告式事務實現

僅僅告訴您在類上使用 @Transactional 註解,在配置中新增 @EnableTransactionManagement,並期望您理解其工作原理,這是不夠的。為了提供更深入的理解,本節將結合事務相關問題,解釋 Spring 框架宣告式事務基礎設施的內部工作原理。

關於 Spring 框架宣告式事務支援,最重要的是要理解此支援是透過 AOP 代理啟用的,並且事務通知是由元資料(目前是基於 XML 或註解的)驅動的。AOP 與事務元資料的結合產生了一個 AOP 代理,該代理結合了 TransactionInterceptor 和適當的 TransactionManager 實現,以驅動方法呼叫周圍的事務。

Spring AOP 在AOP 部分中有介紹。

Spring 框架的 TransactionInterceptor 為命令式和響應式程式設計模型提供了事務管理。攔截器透過檢查方法返回型別來檢測所需的事務管理風格。返回響應式型別(如 Publisher 或 Kotlin Flow(或其子型別))的方法符合響應式事務管理條件。所有其他返回型別,包括 void,都使用命令式事務管理的程式碼路徑。

事務管理風格影響所需的事務管理器。命令式事務需要 PlatformTransactionManager,而響應式事務則使用 ReactiveTransactionManager 實現。

@Transactional 通常與由 PlatformTransactionManager 管理的執行緒繫結事務一起工作,將事務暴露給當前執行執行緒中的所有資料訪問操作。注意:這不會傳播到方法內新啟動的執行緒。

ReactiveTransactionManager 管理的響應式事務使用 Reactor 上下文而不是執行緒區域性屬性。因此,所有參與的資料訪問操作都需要在相同的 Reactor 上下文中的相同響應式管道中執行。

當配置了 ReactiveTransactionManager 時,所有事務界定的方法都應返回一個響應式管道。void 方法或常規返回型別需要與常規 PlatformTransactionManager 關聯,例如,透過相應 @Transactional 宣告的 transactionManager 屬性。

下圖展示了呼叫事務代理上的方法的概念檢視

tx
© . This site is unofficial and not affiliated with VMware.