声明式事务管理

大多数 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 约定(仅在未受检异常上自动回滚), 但自定义此行为通常很有用。