Spring框架事务支持模型的优势

传统上,EE应用程序开发人员在事务管理方面有两种选择:全局事务或本地事务,这两种方式都有深远的局限性。全局和本地事务管理将在接下来的两个部分中进行审查,随后讨论Spring框架的事务管理支持如何解决全局和本地事务模型的局限性。

全局事务

全局事务允许您处理多个事务资源,通常是关系型数据库和消息队列。应用服务器通过JTA管理全局事务,JTA是一个繁琐的API(部分原因是其异常模型)。此外,JTA UserTransaction通常需要从JNDI获取,这意味着您还需要使用JNDI才能使用JTA。使用全局事务限制了应用代码的潜在重用性,因为JTA通常仅在应用服务器环境中可用。

以前,使用全局事务的首选方式是通过EJB CMT(容器管理事务)。CMT是一种声明式事务管理形式(与编程式事务管理相区别)。EJB CMT消除了与事务相关的JNDI查找的需要,尽管使用EJB本身需要使用JNDI。它消除了大部分但并非全部编写Java代码来控制事务的需要。其重要缺点是CMT与JTA和应用服务器环境绑定。此外,只有在选择在EJB中实现业务逻辑(或至少在事务EJB外部)时才可用。总体而言,EJB的负面影响如此之大,以至于这不是一个吸引人的建议,特别是在面对具有吸引力的声明式事务管理替代方案时。

本地事务

本地事务是特定于资源的,例如与JDBC连接关联的事务。本地事务可能更容易使用,但有一个重大缺点:它们无法跨多个事务资源工作。例如,通过使用JDBC连接管理事务的代码无法在全局JTA事务中运行。由于应用服务器不参与事务管理,因此无法帮助确保跨多个资源的正确性。(值得注意的是,大多数应用程序使用单个事务资源。)另一个缺点是本地事务对编程模型具有侵入性。

Spring框架的一致编程模型

Spring解决了全局和本地事务的缺点。它让应用程序开发人员在任何环境中使用一致的编程模型。您只需编写一次代码,它就可以在不同环境中受益于不同的事务管理策略。Spring框架提供声明式和编程式事务管理。大多数用户更喜欢声明式事务管理,在大多数情况下我们推荐使用。

通过编程式事务管理,开发人员使用Spring框架事务抽象,可以在任何底层事务基础设施上运行。在首选的声明式模型中,开发人员通常几乎不编写与事务管理相关的代码,因此不依赖于Spring框架事务API或任何其他事务API。

您是否需要应用服务器进行事务管理?

Spring框架的事务管理支持改变了企业Java应用程序何时需要应用服务器的传统规则。

特别是,您不需要仅仅为通过EJB进行声明式事务而需要应用服务器。事实上,即使您的应用服务器具有强大的JTA功能,您可能会发现Spring框架的声明式事务提供了比EJB CMT更强大和更具生产力的编程模型。

通常,只有当您的应用程序需要处理跨多个资源的事务时,才需要应用服务器的JTA功能,这对许多应用程序并非必需。许多高端应用程序使用单个高度可扩展的数据库(如Oracle RAC)。独立的事务管理器(例如Atomikos Transactions)是其他选择。当然,您可能需要其他应用服务器功能,如Java消息服务(JMS)和Jakarta EE连接器架构(JCA)。

Spring框架让您选择何时将应用程序扩展到完全加载的应用服务器。过去,使用EJB CMT或JTA的唯一替代方案是编写具有本地事务(例如JDBC连接上的事务)的代码,并且如果需要该代码在全局、容器管理的事务中运行,则需要大量重写。使用Spring框架,只需更改配置文件中的一些bean定义(而不是您的代码)。