宣告式事務管理
| 大多數 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。但是,在使用此功能之前請仔細考慮,因為通常情況下,不希望事務跨遠端呼叫。
回滾規則的概念很重要。它們允許您指定哪些異常(和可丟擲物件)應導致自動回滾。您可以在配置中宣告式地指定此內容,而不是在 Java 程式碼中。因此,儘管您仍然可以在 TransactionStatus 物件上呼叫 setRollbackOnly() 來回滾當前事務,但通常您可以指定一個規則,即 MyApplicationException 必須始終導致回滾。此選項的顯著優點是業務物件不依賴於事務基礎設施。例如,它們通常不需要匯入 Spring 事務 API 或其他 Spring API。
雖然 EJB 容器的預設行為在系統異常(通常是執行時異常)發生時自動回滾事務,但 EJB CMT 不會在應用程式異常(即,除了 java.rmi.RemoteException 之外的檢查異常)發生時自動回滾事務。雖然 Spring 宣告式事務管理的預設行為遵循 EJB 約定(僅在未檢查異常時自動回滾),但通常自定義此行為會很有用。