本章内容:
- 集成事务管理
- 编码方式事务管理
- 使用声明式事务
- 以注解的方式描述事务
在软件开发行业,全有或全无的操作被称作事务(taransaction)。事务允许你将几个操作组合成一个要么全部发生要么全部不发生的工作单元。我的理解是,事务是一个全有或全无的工作单元。工作单元由几个操作组成。
一、理解事务
所谓事务,就是将几个操作捆绑成一个"操作"。这样说的前提是操作具有原子性。
1、使用4个词来表示事务
????在传统的软件开发中,人们创建了一个术语来描述事务:ACID。简单的说ACID表示4个特征:
- 原子性:事务中的所有操作要不全部发生,要么全部不发生。如果一个活动失败了,整个事务也就失败并回滚了。
- 一致性:一旦事务完成(不管是成功还是失败),系统必须确保它所建模的业务处于一致状态。现实的数据不应该被损坏。
- 隔离性:事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起。——即,事务必须彼此隔离,避免发生同步读写相同数据的情况(隔离性往往设计到数据库中表或行的锁)
- 持久性:一旦事务完成,事务的结果应该已经被持久化。特就是说数据不变,就算应用程序系统完全崩溃,也能恢复。
2、理解Spring对事务管理的支持
对于Spring的事务管理方面理解下面几点就足够了:
- 与EJB类似,Spring提供了对编码式事务和声明式事务管理的支持。但是Spring在事务管理的某些方面超过了EJB。
- 对于编码式事务的支持,Spring与EJB的区别很大。不像EJB和JTA耦合在一起马样,Spring通过回调机制将实际的事务实现从事务性的代码中抽象出来。实际上,Spring对事务的支持甚至不需要JTA的实现。如果你的应用程序只有一种持久化资源,Spring可以使用持久化机制本身所说提供的事务性支持,这包括了JDBC、Hibernate以及Java持久化API。但是对于应用程序的事务跨多个资源,那么Spring会使用第三方JTA实现来支持分布式(XA)事务。
编码式事务预先用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。
二、选择事务管理器
对于Spring的事务管理器的综述:
Spring不直接管理事务,而是提供了多种事务管理器,而事务管理器又将事务管理的职责委托给JTA或者其他持久化机制所提供的平台相关的事务实现。
Spring的事务管理器相当于充当某一个特定平台的门面。这样让用户在使用Spring中的事务时不需要关注实际的事务实现。(接口与封装的概念)
Spring为每种场景都提供了事务管理器
事务管理器(org.framework.*) |
使用场景 |
jca.cci.connection.CciLocalTransactionManager? |
使用Spring对Java EE连接器架构(Java EE Connector Architecture,JCA)和通用客户端接口(Common Client Interface,CCI)提供支持 |
jdbc.datasource.DataSourceTransactionManager? |
用Spring对JDBC抽象的支持,也可用于使用iBATIS进行持久化的场景 |
jms.connection.JmsTransactionManager? |
用于JMS 1.1+ |
jms.connection.JmsTransactionManager102? |
用于JMS 1.0.2 |
orm.hibernate3.HibernateTransactionManager? |
用于Hibernate3进行持久化 |
orm.jdo.JdoTransactionManager? |
用于JDO进行持久化 |
orm.joa.JpaTransactionManager? |
用于Java持久化 API进行持久化 |
transaction.jta.JtaTransactionManager? |
需要分布式事务或者没有其他的事务管理器满足需求 |
transaction.jta.OC4JJtaTransactionManager? |
用于Oracle的OC4J JEE容器 |
transaction.jta.WebLogicJtaTransactionManager? |
需要使用分布式事务并且应用程序运行于WebLogic中 |
transaction.jta.WebSphereUowTransactionManager? |
需要WebSphere中UOWManager所管理的事务 |
Spring的事务管理器以及特定平台的相关事务实现
1、JDBC事务
?如果我们选择JDBC来进行持久化,那么,DataSourceTransactionManager会为你处理事务边界。
首先,我们需要在XML文中装配它。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
?dataSource是定义在上下文文件中的javax.sql.DataSource Bean。在幕后,DataSourceTransactionManager通过调用java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用connection的commit()方法来提交事务,通过rollback()方法来回滚事务。
2、Hibernate事务
如果我们选择使用Hibernate实现,那么你需要使用HibernateTransactionManager。对于Hibernate 3,需要在Spring上下文中定义它的Bean:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> ????????????<property </bean> |
????sessionFactory属性需要装配一个Hibernate SessionFaction。
????HibernateTransactionManager将事务管理的职责委托给org.hibernate.Transaction对象,而后者将从Hibernate Session中获取到。但事务成功完成时,HibernateTransactionManager将会调用Transaction对象的commit()方法;如果失败将会调用Transaction对象的commit()方法
3、Java持久化API事务
?
4、JTA事务
?
?
三、在Spring中的编码事务
?
?
四、声明式事务
?
?
1、定义事务属性
?
?
2、在XML中定义事务
?
?
3、定义注解驱动的事务
?
?
小结:
?
?
??