您的位置:首页 > 编程语言 > Java开发

spring中的事务配置

2016-03-17 00:00 525 查看
摘要: 事务,就是一组事件,通过事务组合起来,事务中的事件必须同时成功时才会提交事务,一个事务才算完成。在对数据库操作中,当同一事务中的某个事件失败后,事务执行失败,事务中的其他已执行操作必须进行回滚,已保证数据的完整性和安全性。spring对事务操作有很好的支持,记录如下。

一 简介

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

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

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

声明式事务管理之使用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 编程式事务管理
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);
}
});
}

2 配置代理类

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>

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

3 利用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事务管理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: