Spring学习笔记五:Spring进行事务管理
转载请注明原文地址: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进行事务管理的更多相关文章
- Spring学习笔记:声明式事务管理增删改查业务
一.关于是事务 以方法为单位,进行事务控制:抛出异常,事务回滚. 最小的执行单位为方法.决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败 二.声明式事务: 声明式事务(declarative ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- spring学习笔记(22)声明式事务配置,readOnly无效写无异常
在上一节内容中.我们使用了编程式方法来配置事务,这种优点是我们对每一个方法的控制性非常强.比方我须要用到什么事务,在什么位置假设出现异常须要回滚等.能够进行非常细粒度的配置.但在实际开发中.我们可能并 ...
- Spring学习笔记3—声明式事务
1 理解事务 事务:在软件开发领域,全有或全无的操作被称为事务.事务允许我们将几个操作组合成一个要么全部发生要么全部不发生的工作单元. 事务的特性: 原子性:事务是由一个或多个活动所组成的一个工作单元 ...
- spring学习笔记(九)事务学习(上)
前述 这段时间在工作中碰到一个事务相关的问题.先说下这个问题的场景,我们是一个商城项目,正在开发优惠券模块,现在有一个需求是需要批量领取优惠券,而且在领券时,其中一张领取失败不能影响其他符合要求的 ...
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction
1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...
- Spring学习笔记之Spring概述
概述 Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...
随机推荐
- 如何删除mac keeper
如果不小心安装了mac keeper,基本是无法删除的,而且16年以前的方法都不管用.可以这样删除,我已经测试过了,下载https://data-cdn.mbamupdates.com/web/mba ...
- android之卸载反馈的功能
感谢这位大神:http://www.eoeandroid.com/thread-317728-1-1.html zip包里面有讲解的试用方法,和如何试用ndk编译的方法,本人亲身试验,确实可用,现做一 ...
- 《软件定义网络:SDN与OpenFlow解析》
<软件定义网络:SDN与OpenFlow解析> 基本信息 原书名:SDN: Software Defined Networks 原出版社: O'Reilly Media 作者: (美)Th ...
- 联想昭阳(Lenovo)
1996年,联想®昭阳系列推出了第一台笔记本电脑S5100.在经历了十几年的发展之后,联想昭阳系列也成为了国内市场占有率最高的国产商用笔记本品牌之一.昭阳品牌对于联想意义非凡,不仅仅是因为首款联想笔记 ...
- python3.7新增关键字:async、await;带来和kafka-python==1.4.2的兼容性问题
python3.7新增关键字:async.await: kafka-python==1.4.2用到了关键字async,由此带来兼容性问题 解决方案: 升级kafka-python==1.4.4 使用p ...
- 连接sqlServer数据库&jpa调用存储过程Java获取存储过程返回的多个结果集JAVA调用sqlserver存储过程的实现(返回多个结果集的实现)jdbc多结果集(getMoreResults)
存储过程: BEGIN select * from teacher; SELECT * FROM student; END public Object GetMyBOProjectProductLis ...
- 在此处打开OpenPowershellHere右键 在此处打开命令窗口右键
windows 10 右键添加在本文件夹打开cmd 或prowershell 在此处打开OpenPowershellHere右键 Windows Registry Editor Version 5 ...
- 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang
点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...
- 一个简易的WebServer程序
现在这个公司的it管理真不知道说什么了,我主要从事.net方向的开发,公司电脑配置还是win7了,可是自己没有安装iis的权限,it也拒绝安装,想玩玩web安全都不行.于是乎决定开发一个window ...
- 重启Windows的PowerShell
这么简单的一个命令都单独写一篇blog, 是不是太无耻了? 好吧, 谁让咱不会呢. 学会了就来一篇. 呵呵. Restart-Computer 来源 ================ http:/ ...