文档章节

spring中的事务配置

idaren
 idaren
发布于 2016/03/17 15:26
字数 1137
阅读 26
收藏 0

一 简介

spring中提供了三种事务管理的方法。

  1. 编程式事务管理 :亦即自己编写事务管理的代码,通过注入获取到spring中的事务管理器对象后,通过该对象来实现对事务的管理。

  2. 声明式事务管理之配置代理对象 :即为需要配置事务管理的类配置一个代理类,通过代理类来进行事务管理的相关操作。

  3. 声明式事务管理之使用aop进行事务操作 :动态生成代理类进行事务管理的相关操作。

二 配置与使用

0 配置事务管理器

在spring中对事务的操作都必须配置一个事务管理器,这个事务管理器最终会被注入到相关的类中使我们可以对事务进行操作,此处的事务主要指的是对数据库的事务,因此事务管理器配置时必须为其配置直接的或间接的可以操作数据库连接的对象。

1 使用SpringJdbc时,事务管理器要注入一个名为dataSource数据源对象,此处配置的是c3p0连接池,连接池相关参数置于src目录下的jdbc.properties配置文件中,配置信息如下

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.username=root
jdbc.password=123456

在beans.xml文件中的配置

<!-- 获取到配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<!-- 获取配置文件中的相关参数 -->
	<property name="driverClass" value="${jdbc.driverClass}"/>
	<property name="jdbcUrl" value="${jdbc.url}"/>
	<property name="user" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!-- 数据源 -->
	<property name="dataSource" ref="dataSource"/>
</bean>

2 使用hibernate3时,事务管理器要注入一个名为sessionFactory的工厂对象,在beans.xml文件中配置如下

<!-- 配置sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation"
			value="classpath:hibernate.cfg.xml">
		</property>
	</bean>
	
	<!-- 配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
编程式事务管理
1 在beans.xml中
<!-- 配置事务管理模板:spring为简化事务管理的代码而提供的模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
	<property name="transactionManager" ref="transactionManager"></property>
</bean>
2 为需要使用到事务的地方注入事务管理器模板类
<bean id="accountService" class="com.service.impl.AccountServiceImpl">
	<property name="ad" ref="accountDao"/>
	<property name="tt" ref="transactionTemplate"/>
</bean>
3 使用方法:调用transactionTemplate对象的execute(TransactionCallback<Object> action)方法,可以如下所示实现一个接口,将一组事件放入同个事务。
@Override
	public void tranferMoney(String out, String in, double money) {
		System.out.println("AccountServiceImpl Method tranferMoney()");
		tt.execute(new TransactionCallbackWithoutResult() {

			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				//两个事件放入同一事务,必须同时成功
				ad.outMoney(out, money);
				ad.inMoney(in, money);
			}
		});
	}

配置代理类

spring中提供了一个事务代理类,配置需配置需要被代理的类target,即需要进行事务管理的类,还有事务管理的相关参数

<!-- 配置代理类 -->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	<property name="target" ref="accountService"/>
	<property name="transactionManager" ref="txManager"/>
	<property name="transactionAttributes">
		<props>
			<!-- 
				*PROPAGATION : 事务的传播行为
				*ISOLATION   : 事务的隔离级别
				*readOnly    : 只读
				* -Exception : 发生哪些异常回滚事务
				* +Exception : 发生哪些异常不回滚事务
			 -->
			<prop key="tranferMoney">PROPAGATION_REQUIRED</prop>
		</props>
	</property>
</bean>

然后使用时直接使用配置的这个代理类,而不是使用原先的类。

利用aop进行事务的操作
<!-- 配置事务增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
	<!-- 
		name            : 需要增强的方法名
		propagation     : 事务的传播行为
		isolation       : 事务的隔离级别
		read-only       : 只读
		rollback-for    : 发生哪些异常回滚
		no-rollback-for : 发生哪些异常不回滚
	 -->
		<tx:method name="tranferMoney" propagation="REQUIRED"/>
	</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
	<aop:pointcut expression="execution(public * com.service.AccountService+.*(..))" id="pointcut"/>
	<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>

这样,只要是匹配的方法在使用时会自动进行代理。

注解的方式

<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

在需要配置事务的类上加上注解
可以不设置参数,则认为是默认
@Transactional
或者如下般设置参数
@Transactional(propagation=Propagation.REQUIRED)


参考视频

慕课网 Spring事务管理

© 著作权归作者所有

idaren
粉丝 1
博文 16
码字总数 14680
作品 0
广州
程序员
私信 提问
day35_Spring学习笔记_03

一、事务管理 1.1、回顾事务 事务:一组业务操作ABCD,要么全部成功,要么全部不成功。 特性:ACID 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 隔离问题: 脏读:一个事务读到另一...

黑泽明军
2018/08/08
0
0
Struts2+Spring+Hibernate3集成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxdeng/article/details/52278238 1. 加入Struts2,Hibernate3.3,Spring3.3 和数据库驱动包 注意:当有包重复...

降龙十八腿
2016/08/22
0
0
Spring 事务管理高级应用难点剖析: 第 1 部分

Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了重量级 EJB 容器的覆灭。Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来,专注于业务逻辑...

红薯
2010/03/28
1K
2
Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getCon...

rockypeng
2014/01/19
0
0
为什么用Spring来管理Hibernate?

为什么要用Hibernate框架?这个在《Hibernate介绍》博客中已经提到了。 既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢? 首先我们来看一下Hibernate进...

晨曦之光
2012/08/22
464
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
4
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
992
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部