Declarative Transaction Management

  • 对应用程序代码影响最小,符合非侵入式轻量级容器的原则。

  • 不需要理解 AOP 概念即可使用,因为事务方面代码附带 Spring 发行版。

  • 与 EJB CMT 类似,可指定方法级别的事务行为,但不受 JTA 限制,可与不同的事务环境配合使用。

  • 提供声明式回滚规则,无需在 Java 代码中指定,降低了业务对象对事务基础设施的依赖性。

  • 支持 AOP 自定义事务行为,但不支持跨远程调用的事务上下文传播。

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

Spring 框架的声明式事务管理是通过 Spring 面向方面编程 (AOP) 实现的。但是,由于事务方面代码附带 Spring 框架发行版,而且可能以样板化的方式使用,因此通常无需理解 AOP 概念就能有效使用此代码。

Spring 框架的声明式事务管理类似于 EJB CMT,你可以将事务行为(或没有行为)指定到各个方法级别。如有必要,可以在事务上下文中进行一次 setRollbackOnly() 调用。这两种事务管理之间的差异如下:

  • Spring Framework 的声明式事务管理与 JTA 不同,JTA 绑定到 JTA。Spring Framework 的声明式事务管理可在任何环境中运行。它可以通过调整配置文件,使用 JDBC、JPA 或 Hibernate 与 JTA 事务或本地事务配合使用。

  • 您可以将 Spring Framework 声明式事务管理应用到任何类,而不仅仅是特殊类,如 EJB。

  • Spring Framework 提供声明式 rollback rules,EJB 中没有此功能。同时提供了对回滚规则的编程支持和声明式支持。

  • 通过使用 AOP,Spring Framework 可让您自定义事务行为。例如,您可以在事务回滚的情况下插入自定义行为。您还可以添加任意通知,以及事务通知。使用 EJB CMT 时,除了使用 setRollbackOnly() 之外,您无法影响容器的事务管理。

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

回滚规则的概念非常重要。它们让你指定哪些异常(和可抛出对象)应导致自动回滚。你可以用声明式的方式在配置中指定这一点,而不在 Java 代码中指定。因此,尽管你仍然可以在 TransactionStatus 对象上调用 setRollbackOnly() 以回滚当前事务,但通常你可以指定一条规则,即 MyApplicationException 必须始终导致回滚。此选项的显著优点在于,业务对象不依赖于事务基础设施。例如,它们通常无需导入 Spring 事务 API 或其他 Spring API。

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