声明式事务管理
大多数 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 惯例(仅在非受检异常时自动回滚),但自定义此行为通常很有用。