第6章 事务管理

本章内容:

  • 集成事务管理
  • 编码方式事务管理
  • 使用声明式事务
  • 以注解的方式描述事务

在软件开发行业,全有或全无的操作被称作事务(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
name="sessionFactory"
ref="sessFoatory"
/>

</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、定义注解驱动的事务

?
?

小结:

?
?

??

时间: 2024-12-15 04:35:25

第6章 事务管理的相关文章

304441事务管理与并发控制

第10章事务管理与并发控制 •    10.1 事务的基本概念 10.1.1 事务 Ø 事务(Transaction)是构成单一逻辑工作单元的数据库操作序列.这些操作是一个统一的整体,要么全部成功执行(执行结果写到物理数据文件),要么全部不执行(执行结果没有写到任何的物理数据文件).也可以这样理解,事务是若干操作语句的序列,这些语句序列要么全部成功执行,要么全部都不执行.全部不执行的情况是:在执行到这些语句序列中的某一条语句时,由于某种原因(如断电.磁盘故障等)而导致该语句执行失败,这时将撤销在

会话EJB系列(四)SessionBean事务管理

(上一篇文章中我们介绍了<会话EJB系列(三)SessionBean生命周期>,本为的主要介绍SessionBean中事务管理) SessionBean从功能上可以分为两类: 第一类:成为EAO:用于封装底层的实体和JPA,本质上其功能就是DAO.(不需要事务控制.因为JPA本质是对ORM实现的封装.) 第二类:充当业务组件:是底层EAO对象的Facade,系统控制器(如struts中的Action,springMVC中的Controller)将调用他们的业务方法来处理用户请求.(需要添加事务

Spring 事务管理高级应用难点剖析--转

第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zh 概述 Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了重量级 EJB 容器的覆灭.Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来,专注于业务逻辑的开发上,这是一件

[JavaEE - JPA] 3. Spring Framework中的事务管理

前文讨论了事务划分(Transaction Demarcation)在EJB中是如何实现的,本文继续介绍在Spring Framework中是如何完成事务划分的. 我们已经知道了当采用Container事务类型的时候,事务划分主要有以下两种方案(参考这里): 使用JTA接口在应用中编码完成显式划分 在容器的帮助下完成自动划分 在使用JavaEE的EJB规范时,这两种方案分别被实现为BMT以及CMT,关于BMT和CMT在上一篇文章中有比较详尽的讨论(参考这里). 那么对于Spring Framew

深入Spring:自定义事务管理

转自: http://www.jianshu.com/p/5347a462b3a5 前言 上一篇文章讲了Spring的Aop,这里讲一下Spring的事务管理,Spring的事务管理是建立在Aop的基础上的,相比Aop,事务管理的实现耦合性比较小,自定义就比较简单了. 自定义事务 Spring的开启事务管理主要是通过@EnableTransactionManagement注解来实现的.查看源码就会发现,这个注解主要是注入了两个类InfrastructureAdvisorAutoProxyCrea

分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager

1 系列目录 分布式事务系列(开篇)提出疑问和研究过程 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析 2 jdbc事务 2.1 例子 public void save(User user) throws SQLException{ Connection conn=jdbcDao.getConnection(); conn.setAutoCommit(false); try { PreparedStatement ps=conn.pre

数据库事务管理原理

数据库是一个共享资源,可以提供多个用户使用.这些用户程序可以一个一个地串行执行,每个时刻只有一个用户程序运行,执行对数据库的存取,其他用户程序必须等到这个用户程序结束以后方能对数据库存取.但是如果一个用户程序涉及大量数据的输入/输出交换,则数据库系统的大部分时间处于闲置状态.因此,为了充分利用数据库资源,发挥数据库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并发存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性,所以数据库管

线程本地变更,即ThreadLocal--&gt;Spring事务管理

我们知道Spring通过各种模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源.但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享.虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会话的缓存问题,并非数据连接或会话的线程安全问题. 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对

27Spring_的事务管理_银行转账业务加上事务控制_基于tx.aop进行声明式事务管理

上一篇文章中,银行转账业务没有使用事务,会出现问题,所以这篇文章对上篇文章出现的问题进行修改. 事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) 组成 ! 项目结构图: 这个案例和前一篇文章的案例是一样的,我们修改的其实只是ApplicationContext.xml文件,其他代码不会变所以这里就不多做解释了. 直接给出ApplicationContext.xml代码.里面的注释好好看一下. <?xml version="1.0&quo