理解 Spring Framework 的宣告式事務實現

僅僅告訴你用 @Transactional 註解你的類,在你的配置中新增 @EnableTransactionManagement,然後期望你理解這一切是如何工作的,這是不夠的。為了提供更深入的理解,本節將在事務相關問題的背景下解釋 Spring Framework 宣告式事務基礎設施的內部工作原理。

關於 Spring Framework 宣告式事務支援,最重要的概念是:這種支援是透過 AOP 代理啟用的,並且事務通知是由元資料(目前是基於 XML 或註解)驅動的。AOP 與事務元資料的結合會生成一個 AOP 代理,該代理會結合適當的 TransactionManager 實現,使用 TransactionInterceptor 來驅動方法呼叫周圍的事務。

Spring AOP 在AOP 部分中進行了介紹。

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

不同的事務管理型別影響所需的事務管理器。命令式事務需要 PlatformTransactionManager,而響應式事務使用 ReactiveTransactionManager 實現。

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

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

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

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

tx