转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776256.html 

事务管理主要负责对持久化方法进行统一的提交或回滚,Spring进行事务管理即我们无需在代码中显式地书写事务的开启、提交、回滚等操作了,我们只需为Spring指明有哪些方法需要进行事务管理,Spring自动在运行时为那些方法进行事务管理。使用Spring进行事务管理的工作就在于,配置好事务管理器,以及在哪些方法进行管理即可

一:Spring底层关于事务管理的API

Spring封装了几个API用于管理事务,无论在后面使用哪种事务声明方式,底层都是调用这几个API工作的。了解这些API,对于后面配置事务时要配置哪些标签项就一清二楚了。其中,最重要的是前两个:事务管理器、事务定义信息配置接口

1:事务管理器:对事务进行配置,比如:哪些方法进行事务管理、回滚信息配置等。在DAO层使用不同的持久层框架时,所用的事务管理器是不同的。在配置时,要根据所用的持久层框架来配置事务管理器,即:配置真正进行事务管理的实现类。主要有以下几种:其中,前两种是常用的。

2:事务定义:主要对事务传播属性、隔离级别、超时时间、是否只读进行配置。

1)事务传播属性:确定如何为持久化方法增加事务行为。主要解决Service层中业务方法的相互调用问题

事务传播传播属性是针对 当前将要执行的持久化操作方法 所面临的7种情况下 作如何反应,主要分为三种:

第一种,“加入当前事务,将执行的方法有三种选择:

 PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。
   PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
   PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

(上面三种配置的意思是:假设业务方法A中调用了方法B,如果当前有事务(即方法A开启了事务),就把方法B加入当前事务中被管理。如果当前没有事务在执行,则三种配置分别对应了三种行为:新建一个事务来管理方法B、不进行事务管理直接运行方法B、抛出异常)

第二种,“不使用当前事务”:
    PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起不用。

(即:假设业务方法A中调用了方法B,自己新建一个事务来管理将要执行的持久化方法B,如果当前所处的方法A中已有事务,那就挂起当前事务。)
    PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起不用。

(即:假设业务方法A中调用了方法B,则方法B不进行事务管理,如果方法A已有事务,则把A的事务挂起。)
    PROPAGATION_NEVER--以非事务方式执行,如果当前所处方法中存在事务,则抛出异常。

(即:假设业务方法A中调用了方法B,则持久化方法B不进行事务管理,如果A已有事务,则抛出异常)

第三种,“嵌套事务”:

  PROPAGATION_NESTED -- 总是新建一个事务来执行持久化方法。如果方法所处位置已有事务了,就形成了嵌套事务。

    (事务传播属性分三类,其中常用的就是三类中的第一个情况)

2)隔离级别配置:隔离级别是为了解决并发事务可能引发脏读、不可重复读、幻读的情况而配置的

1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别,即:把隔离性交给数据库来保证。

2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离会产生脏读,不可重复读和幻像读。

3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。可以防止脏读。

4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为串行执行。可防止脏读,不可重复读,幻像读。

3)只读属性:如果把事务定义为只读,则该事务中不能进行修改类数据库操作,如:insert/update/delete等。只能进行查询操作

4)超时时间:事务的存在时间,一般很少用到。

二:Spring事务管理的准备

在Spring中进行事务管理,无论哪种方式,都需要使用连接池。连接池我们一般使用C3P0来进行优化。

首先,在一个properties文件中配置好c3p0的配置信息,如:驱动、数据库url、账户、密码等。

然后,在applicationContext.xml中注册连接池,选择C3P0的ComboPooledDataSourse,配置好id以及一系列属性:

默认的数据源配置:

三:Spring声明式事务管理——基于AspectJ的XML配置,使用AOP思想

1:首先,配置事务管理器,根据持久层框架来选择。如:使用Spring提供的JDBCTemplate框架进行持久化操作,则事务管理器为DataSourseTransactionManager。配置时,需要把dataSourse注入给事务管理器。

    <!-- 事务管理器(PlatformTransactionManager) -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

2:然后配置通知:AspectJ提供了基于AOP的事务管理的通知,标签是<tx:advice>。

需要配置:通知的id、所用到的事务管理器id、<tx:attributes>子标签

<tx:attributes>子标签内:配置需要事务管理的方法们

切入点<tx:method name="需要进行事务管理的方法名可以用正则表达式"  对该方法进行事务定义,包括:事务隔离级别属性、事务传播属性、只读属性、回滚异常和不回滚异常配置等>

   <!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 为哪些方法进行事务管理、怎么管理-->
<tx:attributes>
<!-- 所有get开头的方法的事务定义 -->
<tx:method name="get*" propagation="REQUIRED"/>//以正则表达式的形式匹配需要进行事务管理的方法,并指明如何管理事务
<!-- 其他的方法的事务定义-->
<tx:method name="*" .../>
</tx:attributes>
</tx:advice>

3:配置切面

上面配置了的事务通知,通过  正则表达式或精确的方法名 为方法制定了相应的事务。接下来,就要通过切面,把  事务通知  切入到具体的需要事务管理的类中去。

事务通知中定义的method与切面中定义的切入点是怎么匹配的呢?这个过程发生了两次匹配:首先,pointcut表达式根据“返回值 路径.方法名.(参数列表)” 匹配筛选出了一堆持久化操作的方法;然后tx:advice再对这些方法进行匹配筛选:符合 name属性格式的方法名的持久化方法就进行name所处tx:method标签内定义的事务管理。

    <aop:config>
<aop:pointcut id="pointcut1" expression="execution(返回值 路径.方法名.(参数列表))"/>//切入点筛选出需要进行事务管理的方法,至于如何管理,则在tx:advice中再匹配
<aop:pointcut id="pointcut2" expression="execution(返回值 路径.方法名.(参数列表))"/>
<aop:pointcut id="pointcut3" expression="execution(返回值 路径.方法名.(参数列表))"/>
<aop:advisor advice-ref="txAdvice1" pointcut-ref="pointcut1"/>
<aop:advisor advice-ref="txAdvice2" pointcut-ref="pointcut2"/>
<aop:advisor advice-ref="txAdvice3" pointcut-ref="pointcut3"/>
</aop:config>

总结:基于AspectJ的XML事务管理的使用过程为:

配置数据源——配置事务管理器——配置事务管理通知为不同名称格式的方法们自定义事务——配置切面把事务管理通知切入到需要事务管理的方法们

Spring学习笔记五:Spring进行事务管理的更多相关文章

  1. Spring学习笔记:声明式事务管理增删改查业务

    一.关于是事务 以方法为单位,进行事务控制:抛出异常,事务回滚. 最小的执行单位为方法.决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败 二.声明式事务: 声明式事务(declarative ...

  2. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  3. Java架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  4. spring学习笔记(22)声明式事务配置,readOnly无效写无异常

    在上一节内容中.我们使用了编程式方法来配置事务,这种优点是我们对每一个方法的控制性非常强.比方我须要用到什么事务,在什么位置假设出现异常须要回滚等.能够进行非常细粒度的配置.但在实际开发中.我们可能并 ...

  5. Spring学习笔记3—声明式事务

    1 理解事务 事务:在软件开发领域,全有或全无的操作被称为事务.事务允许我们将几个操作组合成一个要么全部发生要么全部不发生的工作单元. 事务的特性: 原子性:事务是由一个或多个活动所组成的一个工作单元 ...

  6. spring学习笔记(九)事务学习(上)

    前述 ​ 这段时间在工作中碰到一个事务相关的问题.先说下这个问题的场景,我们是一个商城项目,正在开发优惠券模块,现在有一个需求是需要批量领取优惠券,而且在领券时,其中一张领取失败不能影响其他符合要求的 ...

  7. Spring 学习笔记(2) Spring Bean

    一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...

  8. [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

    1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...

  9. Spring学习笔记之Spring概述

    概述   Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...

随机推荐

  1. Mac下的Docker及Kubernetes(k8s)本地环境搭建与应用部署、管理界面kubernetes-dashboard

    mac安装docker: brew cask install docker 当然也可以直接去官网下载docker的pkg文件安装 mac的docker国内镜像:网易的镜像地址:http://hub-m ...

  2. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

  3. QT中使用MinGW 编译的protobuf库--包含库的生成和使用

    QT中使用MinGW 编译的protobuf库--包含库的生成和使用 0前言 1准备工作 2生成protobuf库文件 3在QT中测试protobuf的使用 4结语 0前言 最近要在QT中使用prot ...

  4. CentOS 7安装Hadoop 3.0.0

    最近在学习大数据,需要安装Hadoop,自己弄了好久,最后终于弄好了.网上也有很多文章关于安装Hadoop的,但总会遇到一些问题,所以把在CentOS 7安装Hadoop 3.0.0的整个过程记录下来 ...

  5. java web文件下载功能实现 (转)

    http://blog.csdn.net/longshengguoji/article/details/39433307 需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一 ...

  6. capwap学习笔记——初识capwap(五)

    3. CAPWAP Binding for IEEE 802.11 ¢ CAPWAP协议本身并不包括任何指定的无线技术.它依靠绑定协议来扩展对特定无线技术的支持. ¢ RFC5416就是用来扩展CAP ...

  7. Struts2之server端验证

    声明:在我的教程中有些东西,没有提及到.不是我不知道,而是在我个人来看对你们不是太重要的知识点.你们在看课本时有了解到即可.我不会面面俱到的都给你们提及.我写博文的目的是把我这一年的开发经验通过学习s ...

  8. [Docker] Driver Bridge network for linking containers

    In previous postwe have seen how to link two container together by using `--link`: # docker run -d - ...

  9. ASP入门(十二)-Application对象

    在一起协同工作以完成某项任务的一组ASP文件称为一个应用程序.Application 对象用于把这些文件捆绑在一起. Application 对象用于在整个应用程序生存期间保存信息. Applicat ...

  10. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...