:::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 的惯例(回滚只在未检查的异常中自动进行),但自定义这种行为往往是有用的。