声明式事务管理

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

TODAY Framework 的声明式事务管理是通过 Infra 面向切面编程 (AOP) 实现的。但是,由于事务切面代码随 TODAY Framework 分发版一起提供,并且可能以样板方式使用,因此通常不需要了解 AOP 概念即可有效使用此代码。

TODAY Framework 的声明式事务管理类似于 EJB CMT,您可以指定事务行为(或不指定)直到单个方法级别。如果需要,您可以在事务上下文中进行 setRollbackOnly() 调用。两种类型的事务管理之间的区别在于:

  • 与绑定到 JTA 的 EJB CMT 不同,TODAY Framework 的声明式事务管理适用于任何环境。它可以通过调整配置文件,使用 JDBC、JPA 或 Hibernate 处理 JTA 事务或本地事务。

  • 您可以将 TODAY Framework 声明式事务管理应用于任何类,而不仅仅是 EJB 等特殊类。

  • TODAY Framework 提供声明式 回滚规则,这是 EJB 没有的功能。提供了对回滚规则的编程式和声明式支持。

  • TODAY Framework 允许您通过使用 AOP 自定义事务行为。例如,您可以在事务回滚的情况下插入自定义行为。您还可以添加任意通知以及事务通知。使用 EJB CMT,除了使用 setRollbackOnly() 之外,您无法影响容器的事务管理。

  • TODAY Framework 不支持跨远程调用的事务上下文传播,而高端应用服务器支持。如果您需要此功能,我们建议您使用 EJB。但是,在使用此功能之前请仔细考虑,因为通常不希望事务跨越远程调用。

回滚规则的概念很重要。它们允许您指定哪些异常(和 throwable)应导致自动回滚。您可以在配置中以声明方式指定此项,而不是在 Java 代码中。因此,尽管您仍然可以在 TransactionStatus 对象上调用 setRollbackOnly() 来回滚当前事务,但通常您可以指定一个规则,即 MyApplicationException 必须始终导致回滚。此选项的显著优势在于业务对象不依赖于事务基础设施。例如,它们通常不需要导入 Infra 事务 API 或其他 Infra API。

虽然 EJB 容器默认行为会在系统异常(通常是运行时异常)时自动回滚事务,但 EJB CMT 不会在应用程序异常(即除 java.rmi.RemoteException 之外的受检异常)时自动回滚事务。虽然 Infra 声明式事务管理的默认行为遵循 EJB 约定(仅在未检查的异常上自动回滚),但自定义此行为通常很有用。