对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

声明式事务管理

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

Spring 框架的声明式事务管理是通过 Spring 面向切面编程(AOP)实现的。然而,由于事务相关的切面代码已包含在 Spring 框架发行版中,并且可以以样板化的方式使用,因此通常无需深入理解 AOP 概念即可有效地使用这些代码。spring-doc.cadn.net.cn

Spring 框架的声明式事务管理与 EJB CMT 类似,因为你可以将事务行为(或无事务行为)指定到单个方法级别。 如有必要,你可以在事务上下文中调用 setRollbackOnly() 方法。这两种事务管理方式之间的区别在于:spring-doc.cadn.net.cn

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

  • 可以将Spring框架声明式事务管理应用于任何类, 而不仅仅是特殊类如EJB。spring-doc.cadn.net.cn

  • Spring 框架提供了声明式的回滚规则,这是 EJB 中所没有的功能。框架同时支持编程式和声明式的回滚规则。spring-doc.cadn.net.cn

  • Spring 框架允许你通过使用 AOP 来自定义事务行为。 例如,你可以在事务回滚时插入自定义行为。 你还可以在事务通知之外添加任意的增强逻辑。而使用 EJB CMT 时, 除了调用 setRollbackOnly() 之外,你无法干预容器的事务管理。spring-doc.cadn.net.cn

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

回滚规则的概念非常重要。它们允许你指定哪些异常(以及可抛出对象)应触发自动回滚。你可以通过声明式方式在配置中指定这些规则,而无需编写 Java 代码。因此,尽管你仍然可以在 setRollbackOnly() 对象上调用 TransactionStatus 来回滚当前事务,但更常见的情况是,你可以指定一条规则:当抛出 MyApplicationException 时必须始终触发回滚。这种方式的一个显著优势在于,业务对象不再依赖于事务基础设施。例如,它们通常不需要导入 Spring 事务 API 或其他 Spring API。spring-doc.cadn.net.cn

尽管 EJB 容器的默认行为会在系统异常(通常是运行时异常)发生时自动回滚事务,但 EJB 容器管理事务(CMT)在遇到应用异常(即除 java.rmi.RemoteException 之外的受检异常)时不会自动回滚事务。虽然 Spring 声明式事务管理的默认行为遵循 EJB 的约定(仅在未受检异常时自动回滚),但通常自定义此行为会很有用。spring-doc.cadn.net.cn