宣告式交易管理

大多數 Spring Framework 使用者選擇宣告式交易管理。此選項對應用程式程式碼的影響最小,因此最符合非侵入性輕量容器的理想。

Spring Framework 的宣告式交易管理透過 Spring 面向切面程式設計 (AOP) 實現。然而,由於交易切面程式碼隨 Spring Framework 發行版一起提供,並且可以以樣板方式使用,因此通常不必理解 AOP 概念即可有效使用此程式碼。

Spring Framework 的宣告式交易管理與 EJB CMT 類似,因為您可以指定交易行為(或缺少交易行為)到個別方法層級。如有必要,您可以在交易內容中呼叫 setRollbackOnly()。兩種交易管理類型之間的差異如下:

  • 與綁定到 JTA 的 EJB CMT 不同,Spring Framework 的宣告式交易管理可在任何環境中運作。它可以透過調整組態檔,與 JTA 交易或使用 JDBC、JPA 或 Hibernate 的本機交易一起運作。

  • 您可以將 Spring Framework 宣告式交易管理應用於任何類別,而不僅僅是 EJB 等特殊類別。

  • Spring Framework 提供宣告式回滾規則,這是 EJB 沒有的功能。程式化和宣告式都提供回滾規則支援。

  • Spring Framework 讓您可以使用 AOP 自訂交易行為。例如,您可以在交易回滾的情況下插入自訂行為。您也可以新增任意建議以及交易建議。使用 EJB CMT,您無法影響容器的交易管理,除非使用 setRollbackOnly()

  • Spring Framework 不支援跨遠端呼叫傳播交易內容,如同高階應用程式伺服器所做的那樣。如果您需要此功能,我們建議您使用 EJB。但是,在使用此功能之前請仔細考慮,因為通常不希望交易跨越遠端呼叫。

回滾規則的概念很重要。它們讓您可以指定哪些例外(和 throwable)應導致自動回滾。您可以在組態中宣告式地指定此項,而不是在 Java 程式碼中。因此,儘管您仍然可以在 TransactionStatus 物件上呼叫 setRollbackOnly() 以回滾目前的交易,但通常您可以指定一個規則,即 MyApplicationException 必須始終導致回滾。此選項的顯著優點是業務物件不依賴於交易基礎架構。例如,它們通常不需要匯入 Spring 交易 API 或其他 Spring API。

儘管 EJB 容器預設行為在系統例外(通常是執行階段例外)時自動回滾交易,但 EJB CMT 不會在應用程式例外(即,java.rmi.RemoteException 以外的已檢查例外)時自動回滾交易。雖然宣告式交易管理的 Spring 預設行為遵循 EJB 慣例(僅在未檢查的例外上自動回滾),但自訂此行為通常很有用。