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

声明式事务管理

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

Spring框架的声明式事务管理是通过Spring面向切面编程(AOP)实现的。然而,由于事务方面的代码随Spring框架分发,并且可以以模板化的方式使用,因此通常不需要理解AOP概念就可以有效使用这段代码。spring-doc.cadn.net.cn

Spring框架的声明式事务管理类似于EJB CMT,也就是说,您可以将事务行为(或没有事务的行为)指定到单个方法级别。 如果需要,您可以在事务上下文中调用setRollbackOnly()。这两种事务管理方式之间的差异包括:spring-doc.cadn.net.cn

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

  • 你可以将 Spring Framework 的声明式事务管理应用于任何类,而不仅仅是 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不会在发生应用异常(即除<code>0</code>以外的检查型异常)时自动回滚事务。虽然Spring声明式事务管理的默认行为遵循EJB的约定(仅在未检查异常时自动回滚),但通常对这种行为进行自定义会很有用。spring-doc.cadn.net.cn