:::info 大多数 Spring 框架用户选择声明式事务管理。这个选项对应用程序代码的影响最小,因此与非侵入性的轻量级容器的理想最一致。 :::

    Spring 框架的声明式事务管理是通过 Spring 面向切面编程(AOP)实现的。然而,由于事务方面的代码是随 Spring 框架的发布而来,并且可以以模板的方式使用,所以一般不需要理解 AOP 的概念来有效地使用这些代码。

    Spring 框架的声明式事务管理与 EJB CMT 类似,你可以指定事务行为(或不指定),直至单个方法级别。如果有必要,你可以在事务上下文中进行setRollbackOnly()调用。这两种类型的事务管理的区别在于:

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

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

    • Spring 框架提供了声明性的回滚规则,这是一个没有 EJB 对应的功能。对回滚规则的程序性和声明性支持都有提供。

    • Spring 框架允许你通过使用 AOP 来定制事务性行为。例如,你可以在事务回滚的情况下插入自定义行为。你还可以添加任意的 advice,以及事务性 advice。通过 EJB CMT,你不能影响容器的事务管理,除非使用setRollbackOnly()

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

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

    尽管 EJB 容器的默认行为会在系统异常(通常是运行时异常)时自动回滚事务,但 EJB CMT 不会在应用程序异常(即除 java.rmi.RemoteException 外的被检查的异常)时自动回滚事务。虽然 Spring 声明式事务管理的默认行为遵循了 EJB 的惯例(回滚只在未检查的异常中自动进行),但自定义这种行为往往是有用的。