声明式事务管理

大多数 Spring 框架用户选择声明式事务管理。此选项对应用程序代码的影响最小,因此最符合非侵入式轻量级容器的理念。

Spring 框架的声明式事务管理是通过 Spring 面向方面编程 (AOP) 实现的。但是,由于事务方面代码随 Spring 框架分发,并且可以以模板方式使用,因此通常不需要了解 AOP 概念即可有效使用此代码。

Spring 框架的声明式事务管理类似于 EJB CMT,您可以指定事务行为(或缺乏事务行为)到单个方法级别。如果需要,您可以在事务上下文中进行 setRollbackOnly() 调用。两种事务管理类型之间的区别是

  • 与绑定到 JTA 的 EJB CMT 不同,Spring 框架的声明式事务管理可以在任何环境中工作。它可以通过调整配置文件与 JTA 事务或使用 JDBC、JPA 或 Hibernate 的本地事务一起工作。

  • 您可以将 Spring 框架声明式事务管理应用于任何类,而不仅仅是像 EJB 这样的特殊类。

  • Spring 框架提供声明式 回滚规则,这是一个没有 EJB 等效功能的功能。程序化和声明式回滚规则支持都已提供。

  • Spring 框架允许您使用 AOP 来定制事务行为。例如,您可以在事务回滚的情况下插入自定义行为。您也可以添加任意建议,以及事务建议。使用 EJB CMT,您无法影响容器的事务管理,除了使用 `setRollbackOnly()`。

  • Spring 框架不支持跨远程调用的事务上下文传播,就像高端应用服务器那样。如果您需要此功能,我们建议您使用 EJB。但是,在使用此功能之前请仔细考虑,因为通常情况下,您不希望事务跨越远程调用。

回滚规则的概念很重要。它们允许您指定哪些异常(以及可抛出对象)应该导致自动回滚。您可以在配置中声明性地指定此规则,而不是在 Java 代码中。因此,尽管您仍然可以在 `TransactionStatus` 对象上调用 `setRollbackOnly()` 来回滚当前事务,但最常见的是,您可以指定一个规则,即 `MyApplicationException` 必须始终导致回滚。此选项的显著优势在于业务对象不依赖于事务基础设施。例如,它们通常不需要导入 Spring 事务 API 或其他 Spring API。

尽管 EJB 容器默认行为会在系统异常(通常是运行时异常)时自动回滚事务,但 EJB CMT 不会在应用程序异常(即除 `java.rmi.RemoteException` 之外的已检查异常)时自动回滚事务。虽然 Spring 声明式事务管理的默认行为遵循 EJB 惯例(仅在未检查的异常时自动回滚),但定制此行为通常很有用。