声明式事务管理
| 大多数 Spring Framework 用户选择声明式事务管理。此选项对应用程序代码的影响最小,因此与非侵入式轻量级容器的理念最为一致。 |
Spring Framework 的声明式事务管理通过 Spring 面向切面编程 (AOP) 实现。然而,由于事务切面代码随 Spring Framework 分发,并且可以以样板代码的方式使用,因此通常不必理解 AOP 概念即可有效利用此代码。
Spring Framework 的声明式事务管理与 EJB CMT 相似,因为它可以在单个方法级别指定事务行为(或缺乏事务行为)。如有必要,您可以在事务上下文中调用 setRollbackOnly()。两种事务管理类型之间的区别在于:
-
与绑定到 JTA 的 EJB CMT 不同,Spring Framework 的声明式事务管理适用于任何环境。它可以通过调整配置文件来与 JTA 事务或本地事务(通过使用 JDBC、JPA 或 Hibernate)一起工作。
-
您可以将 Spring Framework 声明式事务管理应用于任何类,而不仅仅是 EJB 等特殊类。
-
Spring Framework 提供了声明式回滚规则,这是一个 EJB 没有的功能。同时提供了回滚规则的编程支持和声明式支持。
-
Spring Framework 允许您通过 AOP 自定义事务行为。例如,您可以在事务回滚的情况下插入自定义行为。您还可以添加任意建议,以及事务建议。使用 EJB CMT,您无法影响容器的事务管理,除了使用
setRollbackOnly()。 -
Spring Framework 不支持跨远程调用传播事务上下文,高级应用服务器支持此功能。如果您需要此功能,我们建议您使用 EJB。但是,在使用此功能之前请仔细考虑,因为通常情况下,不希望事务跨远程调用。
回滚规则的概念很重要。它们允许您指定哪些异常(和可抛出对象)应导致自动回滚。您可以在配置中声明式地指定此内容,而不是在 Java 代码中。因此,尽管您仍然可以在 TransactionStatus 对象上调用 setRollbackOnly() 来回滚当前事务,但通常您可以指定一个规则,即 MyApplicationException 必须始终导致回滚。此选项的显著优点是业务对象不依赖于事务基础设施。例如,它们通常不需要导入 Spring 事务 API 或其他 Spring API。
虽然 EJB 容器的默认行为在系统异常(通常是运行时异常)发生时自动回滚事务,但 EJB CMT 不会在应用程序异常(即,除了 java.rmi.RemoteException 之外的检查异常)发生时自动回滚事务。虽然 Spring 声明式事务管理的默认行为遵循 EJB 约定(仅在未检查异常时自动回滚),但通常自定义此行为会很有用。