声明式事务管理

大多数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约定(仅在未检查异常上自动回滚),但通常有必要自定义此行为。