Spring 事物机制总结
之前工作当中用到Spring的事务管理机制,但是一直不知道起到什么作用。所以整理了一些资料,以便于对它进行更加详细的了解。
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
具体如下图:
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation" value="classpath:hibernate.cfg.xml" />
- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
- </bean>
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
注意:sessionFactorty和transactionManager是下面5中配置方式的基本配置,
第一种方式:每个Bean都有一个代理
- <!-- 配置DAO -->
- <bean id="userDaoTarget" class="com.test.spring.dao.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <bean id="userDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <!-- 配置事务管理器 -->
- <property name="transactionManager" ref="transactionManager" />
- <property name="target" ref="userDaoTarget" />
- <property name="proxyInterfaces" value="com.test.spring.dao.GeneratorDao" />
- <!-- 配置事务属性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
- <bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
- <!-- 配置事务管理器 -->
- <property name="transactionManager" ref="transactionManager" />
- <!-- 配置事务属性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
- <!-- 配置DAO -->
- <bean id="userDaoTarget" class="com.test.spring.dao.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <bean id="userDao" parent="transactionBase">
- <property name="target" ref="userDaoTarget" />
- </bean>
- <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager" />
- <!-- 配置事务属性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <list>
- <value>*Dao</value>
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- </list>
- </property>
- </bean>
- <!-- 配置DAO -->
- <bean id="userDao" class="com.test.spring.dao.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="*" propagation="REQUIRED" />
- </tx:attributes>
- </tx:advice>
- <aop:config>
- <aop:pointcut id="interceptorPointCuts"
- expression="execution(* com.test.spring.dao.*.*(..))" />
- <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
- </aop:config>
- public class test {
- @Transactional
- public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
- public List<User> listUsers() {
- return null
- }
- }
- }
编程式事务
Spring的编程式事务即在代码中使用编程的方式进行事务处理,可以做到比声明式事务更细粒度。有两种方式一是使用TransactionManager,另外就是TransactionTemplate。
1)TransactionManager使用方式
- public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
- private HibernateTransactionManager transactionManager;
- private DefaultTransactionDefinition def;
- public HibernateTransactionManager getTransactionManager() {
- return transactionManager;
- }
- public void setTransactionManager(HibernateTransactionManager transactionManager) {
- this.transactionManager = transactionManager;
- }
- public void createTransactionDefinition() {
- def = new DefaultTransactionDefinition();
- def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
- def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
- }
- public void saveOrUpdate(User user) {
- TransactionStatus status = transactionManager.getTransaction(def);
- try {
- this.getHibernateTemplate().saveOrUpdate(user);
- } catch (DataAccessException ex) {
- transactionManager.rollback(status);
- throw ex;
- }
- transactionManager.commit(status);
- }
- }
2)TransactionTemplate方式
- ResultDto ret = null;
- ret = (ResultDto) this.transactionTemplate.execute(new TransactionCallback() {
- @Override
- public Object doInTransaction(TransactionStatus status) {
- ResultDto ret = null;
- try {
- drillTaskDao.deleteByKey(taskid);
- } catch (Exception e) {
- logger.error("delDrillTask:" + e.getMessage(), e);
- ret = ResultBuilder.buildResult(ResultBuilder.FAIL_CODE, null, ErrorCode.COM_DBDELETEERROR);
- return ret;
- }
- finally {
- status.setRollbackOnly();
- }
- ret = cleartaskrelativedata(taskid, appid, true);
- return ret;
- }
- });
- return ret;
相关推荐
- Linux网络总结三-TCP的可靠机制
- LCN基于Spring cloud2.0实现分布式事物管理(一)LCN的修改和部署
- 终于总结出Spring全家桶+微服务设计模式+Netty+MySQL调优PDF
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
- Java 权限框架 Shiro 实战二:与spring集成、filter机制
- 应届生面试要点总结(5)Spring相关
- 每个 Android 开发者必须知道的消息机制问题总结
- volatile的原理和实现机制 系统级别原理 MESI协议 总结笔记
- 哇塞~Spring知识点总结!已整理成142页离线文档(源码笔记+思维导图)
- Spring知识点总结!已整理成142页离线文档(源码笔记+思维导图)
- 面试官问:“谈谈对AOP的理解”
- 关于WinForm自定义控件添加的问题