宣告式事務管理

大多數 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 提供了對回滾規則的程式設計式和宣告式支援。

  • 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 慣例(僅在非受檢異常時自動回滾),但自定義此行為通常很有用。