Spring中的事务管理技术
1、J2EE平台中的事务管理的类型
(1)全局和局部事务管理
J2EE的事务管理分作global的事务管理与local的事务管理。
(2)global的事务管理由应用服务器容器来管理
global的事务管理由应用服务器容器来管理,它依赖于JTA,并有能力处理多个事务资源,就参考手冊所言的,JTA不易使用(因为它是一个直接用起来很笨重的API,一般只在多数据库访问时的分布式事务管理中才被应用)。
通常在J2EE的应用系统中,一般都借助于EJB CMT(基于容器的事务管理)形式来实现(因为许多J2EE开发者感到EJB CMT是对于事务管理唯一合理的选择)。
(3)local的事务管理
local的事务管理中,应用服务器容器不介入事务管理,local的事务管理通常依赖于特定資源,像是JDBC、Hibernate等中的事务控制的方法(如rollback()、commit()等方法)。local的事务管理对于組件本身有比较强的侵入性,我们必須自己管理事务的边界----也就是我们必須明确地在程序中编写rollback()、commit()等方法来处理事务,由於直接依赖于特定資源,在組件移植时,事务管理部份就有可能不相兼容,例如转换至应用服务器容器的事務管理时。
2、Spring中的事务技术的特点:提供一个一致的编程模型
Spring本身并没有直接提供事务管理方面的技术实现(包括local和global的事务管理),其local类型的事务管理实现由JDBC来完成,而分布式事务(global的事务)需要底层的JTA来实现。
但是Spring提供了事务的抽象,即底层真正事务实现可以切换而不影响应用程序代码。这样应用程序可以依赖于底层的应用服务器容器,也可以轻易地脱离开应用服务器容器的环境----从而增加了系统的可移植性。
l DataSourceTransactionManager
l JtaTransactionManager
l HibernateTransactionManager
因此,当我们将应用系统从一种事务管理方式(如直接使用JDBC或者Hibernate的事务以避免JTA带来的额外负担)转换为多数据库访问时的分布式事务管理时,我们只需要简单地重新进行配置。
3、Spring中的事务管理的具体实现-----有两种实现方式
(1)代码控制的事务管理(programmatic transaction management)---程序实现事务管理
通过类似于JdbcTemplate的回调模板编程管理事务,比起直接使用JTA要容易多了
(2)声明控制的事务管理(declarativetransaction management)---容器实现事务管理
类似于EJB CMT的声明式事务管理,但是不需要EJB容器同时可以应用到任何POJO目标对象-----因此,有了Spring之后,声明性事务不再是EJB独有,我们不必为了获得声明性事务的功能而去忍受EJB技术所带来的种种不便----因为,它是一个轻量级的事务架构。
4、代码控制的事务管理的一般实现方式
(1)总体上可以分为两大类的实现方式
l 一类是通过直接使用实现PlatformTransactionManager接口的类。
l 另一类是通过使用TransactionTemplate模板类,模板类的使用可以简化事务控制代码。
(2)优缺点
l 优点:保持与JDBC的事务处理的编程相兼容,并且比较灵活
这样,可以继续保持与传统的事务处理的编程一样,例如JDBC的原来的代码可以照样编写,而不必作太大的改变,而且Spring提供了一些辅助类与Template类,可以简化传统的数据库操作与事务处理,并可以运用其异常层次的优点。
l 其缺点代码量大,存在重复的代码比较多。
5、声明控制的事务管理的一般实现方式
(1)Spring对于声明式事务划分的支持实际上是利用了它的AOP机制
相对于编程式事务划分,这种基于AOP的方式比较灵活,而且对代码的侵入性几乎为零。因此,如果没有特殊需要推荐使用这种事务划分方式。
(2)实现的机制
基于AOP的常用事务划分方式可以使用ProxyFactoryBean加TransactionInterceptor方式,或者使用TransactionPorxyFactoryBean的方式。前一种方式相对比较灵活,而后一种则对使用相对比较简单。
(3)Spring声明式事务管理和EJBCMT的相似之处
Spring声明式事务管理和EJBCMT它们两者的基本实现方法在某些方面是相似的-----比如,都可以指定事务管理到单独的方法;如果需要可以在事务上下文调用setRollbackOnly()方法。
(4)Spring声明式事务管理和EJB CMT的不同之处
l 不象EJB CMT绑定在JTA上,Spring声明式事务管理可以在任何环境下使用;
l 同时,我们只需更改配置文件,它就可以和JDBC、JDO、Hibernate或其它的事务实现的机制一起工作,相互集成在一起。
l Spring可以使声明式事务管理应用到普通Java对象,不仅仅是特殊的类,如EJB组件类。
l Spring允许我们通过AOP定制事务行为。如果我们的应用系统需要此功能,我们则可以在事务回滚中插入定制的行为。
因为,我们可以增加任意的通知,就象事务通知一样。而使用 EJB CMT时,除了使用setRollbackOnly()之外,我们没有什么办法能够影响容器的事务管理。
之所以能够达到如此特性,是由于TransactionProxyFactoryBean允许我们通过“preInterceptors”和“postInterceptors”属性设置“前”或“后”类型的通知(Advice)来提供额外的拦截行为。
并且允许我们设置任意数量的“前”和“后”通知(Advice),它们的类型可以是 Advisor(可以包含一个切入点)、MethodInterceptor或被当前Spring配置支持的通知类型 (例如ThrowAdvice, AfterReturningtAdvice或BeforeAdvice等类型。因为,这些都是Spring默认支持的通知类型)。
l 当然,Spring不提供高端应用服务器提供的跨越远程调用的事务上下文传播(分布式事务的支持)。因此,如果在我们的应用系统中需要这些特性,此时一般应该采用EJB组件技术。
l Spring提供声明式回滚规则:EJB没有对应的特性
<bean id="transactionProxyFactoryBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<propertyname="transactionManager">
<refbean="transactionManager"/>
</property>
<propertyname="target">
<ref bean="daoServiceBeanTarget"/>
</property>
<propertyname="transactionAttributes">
<props>
<propkey="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
<propkey="update*">PROPAGATION_REQUIRED</prop>
<propkey="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
注意:
上面的“insert*”的映射的值设置回滚规则。添加的“-MyCheckedException”指定如果方法抛出MyCheckedException或它的子类异常,事务将会自动回滚。
可以用逗号分隔定义多个回滚规则。其中的“-”前缀强制回滚,“+”前缀表示产生指定的异常时立即提交(这允许即使抛出unchecked异常时也可以提交事务)。
6、声明控制的事务管理的优点
(1)Spring可以用来帮助实现对事务的管理而无须使用EJB
Spring本身也是一个容器,只是相对EJB容器所要付出的代价而言,Spring属于轻量级容器,它能够替代EJB,通过使用AOP来提供声明式事务管理,即可通过Spring实现基于容器的事务管理(从本质上来讲,Spring的事务管理是基于动态AOP)。
(2)Spring中的声明控制的事务管理与EJB中的容器的事务管理的不同点
l Spring可以为任意的Java Class实现事务管理而无须转换成标准的EJB;
l Spring事务管理并不依赖特定的事务资源从而使得系统的应用与部署更佳灵活。
7、Spring中与事务管理相关的一些类和接口
(1)继承关系
(2)PlatformTransactionManager接口的各个实现类
l DataSourceTransactionManager
l JtaTransactionManager
l HibernateTransactionManager
l JdoTransactionManager
l PersistenceBrokerTransactionManager
l JmsTransactionManager
(3)应用JtaTransactionManager类实现分布式事务
无论是单个还是多个事务资源管理器,都可以使用JtaTransactionManager类。
如果使用JtaTransactionManager,那么所有事务管理实际都会委托给底层应用服务器的JTA实现。
8、org.springframework.transaction.PlatformTransactionManager接口
(1)定义
(2)在该接口中定义了如下的方法
public interface PlatformTransactionManager
{
TransactionStatus getTransaction(TransactionDefinitiondefinition) throws TransactionException;
voidcommit(TransactionStatus status) throws TransactionException;
voidrollback(TransactionStatus status) throws TransactionException;
}
所有Spring的事务分离功能都会委托给PlatformTransactionManager(传给相应的TransactionDefinition实例)来做实际的事务执行。
(3)三个常用的实现类
在Spring中,提供了几种不同的PlatformTransactionManager的具体实现,分为如下两个类别:
l 本地事务策略—支持单一资源的事务(通常是单个数据库),其包括org.springframework.jdbc.datasource.DataSourceTransactionManager和 org.springframework.orm.hibernate3.HibernateTransactionManager。
l 全局事务管理—支持可能跨越多个资源的全局事务。其相应的类为org.springframework.transaction.jta.JtaTransactionManager,将事务委托给遵循JTA规范的事务协调器(通常为J2EE服务器,但不是强制的)。
(4)PlatformTransactionManager抽象化的主要意义在于-----应用程序并不限定于某个特定的事务管理环境
通过选择PlatformTransactionManager接口的不同实现类,可以很容易地切换事务策略。这允许应用程序代码和声明性事务划分保持不变,不管应用程序组件用在哪种环境中。
例如,应用程序的一个基础版本可能部署到Tomcat环境中,并与一个Oracle数据库交互。它可以使用便捷的Spring事务划分,选择JDBCDataSourceTransactionManager作为其事务策略。Spring将划分事务,而且JDBC驱动程序将执行对应的纯JDBC事务。
而这个应用程序的另外一个版本也许部署在WebLogic Server环境中,与两个Oracle数据库交互。但是,应用程序代码和事务划分无需更改。唯一需要调整的是选择JtaTransactionManager作为事务策略,让Spring划分事务,而WebLogic Server的事务协调程序执行事务。
9、PlatformTransactionManager接口的各个实现类的具体应用
通过采用Spring的事务支持,底层事务采用何种方式的决定就不必在一开始开发就做出决定。因为我们能够通过Spring的外部配置文件来进行切换真正的事务支持。
(1)如果使用JDBC或iBATIS作为系统的事务资源管理器
则我们可以使用简单的DataSourceTransactionManager实现类,其配置文件的片断如下:
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource">
<ref local="dataSource" />
</property>
</bean>
(2)如果使用Hibernate作为系统的事务资源管理器
那么我们可以使用HibernateTransactionManager实现类,其配置文件的片断如下:
<beanid="transactionManager"class="org.springframework.orm.hibernate.HibernateTransactionManager">
<propertyname="sessionFactory">
<reflocal="sessionFactory"/>
</property>
</bean>
(3)如果使用WebSphere应用服务器的JTA支持
我们只需要把上述对应bean中的class属性改成为org.springframework.transaction.jta.JtaTransactionManager,然后再把属性改为WebSphere对应的TransactionManager,参考如下:
<beanid="wasTxMgr"class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/>
<beanid="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager">
<propertyname="transactionManager">
<reflocal="wasTxMgr"/>
</property>
</bean>
分享到:
相关推荐
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。
在实际应用中,Spring 的声明式事务管理不仅限于JDBC,还支持其他数据访问技术,如Hibernate、MyBatis等。同时,Spring还提供了编程式事务管理,允许开发者在代码中手动管理事务,但这种方式通常在更复杂的场景或...
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的事务管理功能是它的一大亮点。本篇文章将深入探讨Spring事务管理的五种...在实际开发中,结合源码阅读和工具辅助,可以更深入地掌握Spring事务管理的精髓。
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
在实际开发中,理解这部分源码有助于我们更深入地掌握Spring事务管理的工作原理。 至于工具,开发者可以使用诸如IntelliJ IDEA这样的IDE,其中集成的调试工具可以帮助我们跟踪代码执行流程,查看事务状态的变化,...
这个版本的Spring事务管理支持JDBC、Hibernate、JPA、iBatis等多种数据访问技术,可以无缝集成到各种持久层框架中。 在Spring中,事务管理器(如DataSourceTransactionManager或HibernateTransactionManager)是...
通过依赖于PlatformTransactionManager接口及各种技术实现,Spring在事务管理上可以让开发人员使用一致的编程模型,即使所使用的是不同的事务管理技术。 事务隔离级别 事务的隔离级别是指事务在执行过程中对资源...
#### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...
Spring框架的核心功能包括一个容器、一个用于配置和组织组件的框架,以及一系列内置于框架中的服务,如事务管理、持久化支持和Web用户界面服务。作为一个轻量级的J2EE框架,Spring为构建和组织J2EE应用程序提供了一...
在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...
### Spring事务管理详解 #### 一、事务管理基础概念 在深入探讨Spring事务管理之前,我们需要先理解什么是事务。事务可以被定义为一系列的操作集合,这些操作作为一个整体被提交或回滚。简单来说,事务就是一个不...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本篇文章将详细探讨Spring中的三种...在实际项目中,根据项目规模、团队习惯和技术栈选择合适的事务管理策略是非常重要的。
- **统一的事务策略**:Spring事务管理支持JDBC、Hibernate、JPA等多种数据访问技术,提供了一致的事务处理方式。 - **灵活性**:可以选择编程式或声明式事务管理,根据项目需求调整事务控制粒度。 - **异常传播**:...
其中,Spring的分布式事务管理是其核心特性之一,它允许开发者在分布式系统环境中处理复杂的事务逻辑。本篇将深入探讨Spring如何实现分布式事务,以及涉及到的相关技术。 首先,分布式事务是指在多个数据库或者服务...
在实际应用中,Spring事务管理的配置和使用需要注意以下几个方面: - 事务传播行为:定义了事务在遇到已有事务时的行为模式,例如是否加入当前事务、新建一个事务等。 - 事务隔离级别:定义了事务的隔离水平,例如...
Spring的事务管理不仅限于JDBC,还支持Hibernate、JDO、OJB等持久层技术,并且能够处理涉及多个资源的分布式事务。对于只需要单一持久化资源的应用,可以直接使用该资源自身的事务支持;对于需要跨资源的事务,...
首先,我们来看一下Spring事务管理的核心接口`PlatformTransactionManager`。这个接口是Spring事务管理的高层次抽象,它负责真正地管理事务,包括提交、回滚以及其他的事务控制。Spring为不同的持久层技术(如JDBC、...
### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...
首先,Spring事务管理有两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理是通过调用`PlatformTransactionManager`接口提供的方法来显式地开始、提交、回滚事务。而声明式事务管理则基于AOP(面向切面...
这些管理器使得事务管理与具体的技术实现解耦,提高了代码的可维护性和复用性。 4. **案例开发** 例如,一个转账功能可能涉及到两个账户之间的资金转移,这就需要在一个事务中执行,确保转账操作的原子性。另一个...