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