spring中的事务配置
2016-03-17 00:00
525 查看
摘要: 事务,就是一组事件,通过事务组合起来,事务中的事件必须同时成功时才会提交事务,一个事务才算完成。在对数据库操作中,当同一事务中的某个事件失败后,事务执行失败,事务中的其他已执行操作必须进行回滚,已保证数据的完整性和安全性。spring对事务操作有很好的支持,记录如下。
一 简介
spring中提供了三种事务管理的方法。
编程式事务管理 :亦即自己编写事务管理的代码,通过注入获取到spring中的事务管理器对象后,通过该对象来实现对事务的管理。
声明式事务管理之配置代理对象 :即为需要配置事务管理的类配置一个代理类,通过代理类来进行事务管理的相关操作。
声明式事务管理之使用aop进行事务操作 :动态生成代理类进行事务管理的相关操作。
二 配置与使用
0 配置事务管理器
在spring中对事务的操作都必须配置一个事务管理器,这个事务管理器最终会被注入到相关的类中使我们可以对事务进行操作,此处的事务主要指的是对数据库的事务,因此事务管理器配置时必须为其配置直接的或间接的可以操作数据库连接的对象。
1 使用SpringJdbc时,事务管理器要注入一个名为dataSource数据源对象,此处配置的是c3p0连接池,连接池相关参数置于src目录下的jdbc.properties配置文件中,配置信息如下
在beans.xml文件中的配置
2 使用hibernate3时,事务管理器要注入一个名为sessionFactory的工厂对象,在beans.xml文件中配置如下
1 编程式事务管理
2 配置代理类
spring中提供了一个事务代理类,配置需配置需要被代理的类target,即需要进行事务管理的类,还有事务管理的相关参数
然后使用时直接使用配置的这个代理类,而不是使用原先的类。
3 利用aop进行事务的操作
这样,只要是匹配的方法在使用时会自动进行代理。
注解的方式
参考视频
慕课网 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事务管理
相关文章推荐
- 深入理解JAVA虚拟机,JVM内存划分笔记
- jetty 3.9.0和 run-jetty-run1.3.3.2 eclipse插件的使用区别
- Java数组操作的10大方法,大部分代码都来自Stack Overflow。
- svg文件eclipse中报错解决方法
- eclipse 生成javadoc乱码问题解决
- mysql数据库+java实现事务控制工作笔记
- Eclipse查找替换巧妙技巧用法
- Eclipse 打包Java:Unsupported major.minor version 51.0 (unable to load class
- java读取文件并上传
- Java IO流读取/写入/修改某个字符串(通用)
- java反射机制
- java中的远程debug调试
- 分布式事务 Spring+JTA+Atomikos+Hibernate+JMS
- 安装JDK
- eclipse 查看class 所属jar包
- JAVA正则表达式:Pattern类与Matcher类详解(转)
- java JPA之EntityManager
- Spring MVC与JAX-RS比较与分析
- eclipse 默认UTF-8 -Dfile.encoding=UTF-8
- eclipse导入远程git代码及(push、pull、及maven工程导入)