spring框架有自己的事务管理机制,spring使用DataSourceTransactionManager作为Jdbc的事务管理器,同时把被管理的对象使用TransactionProxyFactoryBean配置,TransactionProxyFactoryBean是个事务代理的Bean,能够使用IOC、AOP等注入事务管理代码
。
demo代码使用https://www.yeetrack.com/post/2013-03-27/spring%20DAO%E6%A8%A1%E5%9D%97%E6%94%AF%E6%8C%81jdbc这里的代码,新建TransactionRun.java文件:
package com.yeetrack.springDAO; import java.util.Date; /** * * @author youthflies * */ public class TransactionRun { private IPersonDAO personDao; public IPersonDAO getPersonDao() { return personDao; } public void setPersonDao(IPersonDAO personDao) { this.personDao = personDao; } /** * runsql中的代码与TestDao中的一样,不过其中getPersonName()方法会报异常 * 如果没有事务控制,personDao.addPerson()会执行成功 * 如果有事务控制器,因为runSql中爆出异常,整个事务都会回滚 */ public void run() { Person person =new Person(); person.setName("youthflies--1"); person.setAge(22); person.setSex("M"); person.setBirthday(new Date()); personDao.addPerson(person); System.out.println(personDao.getPersonName(1212312312389));//这里因为异常,会导致整个事务执行失败 System.out.println(personDao.getPersionCount()); System.out.println(personDao.listPerson()); } }
在applicationContext.xml中配置事务:
<!-- jdbc 事务管理器 --> <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 为方法配置事务 --> <bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> <property name="properties"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> <!-- 事务类型,如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 --> </props> </property> </bean> <!-- 使用proxy,将事务管理注入到目标方法中 --> <bean id="transactionRun" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="jdbcTransactionManager"></property> <property name="target"> <bean class="com.yeetrack.springDAO.TransactionRun"> <property name="personDao" ref="personDao"></property> </bean> </property> <property name="transactionAttributeSource" ref="transactionAttributeSource"></property> </bean>
spring会在指定方法执行前开启事务,在指定方法结束后提交事务,如果中间有异常,事务会回滚。
下面是测试代码:
package com.yeetrack.springDAO; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestTransction { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); TransactionRun transaction = (TransactionRun) context.getBean("transactionRun"); transaction.run(); } }
版权声明
本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。
© 空空博客,本文链接:https://www.yeetrack.com/?p=4
近期评论