Spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活方便。 



  1、传统使用JDBC的事务管理 



  以往使用JDBC进行数据操作,使用DataSource,从数据源中得到Connection,我们知道数据源是线程安全的,而连接不是线程安全的,所以对每个请求都是从数据源中重新取出一个连接。一般的数据源由容器进行管理,包括连接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE商业容器都提供了这个功能。 



  以往的我们使用JDBC在写代码时,事务管理可能会是这样: 



Connection conn = null; 

try{ 

 conn = DBConnectionFactory.getConnection; 

 conn.setAutoCommit(false); 

 //do something 

 conn.commit(); //commit transcation 

}catch(Exception e){ 

 conn.rollback(); 



finally{ 

 try{ 

  conn.close(); 

 } catch(SQLException se){ //do sth.} 

 //close ResultSet,PreparedStatement,Connection 

 //notice:Maybe ocurr Exception when u close rs,pstmt,conn 





  按照以往的思路来写代码,代码量比较长,而且容易疏忽,忘掉一些try/catch,引发一些异常无法catch,虽然有时候我们会写DBTool类,来关闭这些资源,并且保证在关闭这些资源时,不向外抛异常,但是这样做会导致额外的麻烦。 



  2、Spring提供的编程式的事务处理 



  Spring提供了几个关于事务处理的类:TransactionDefinition //事务属性定义 



  TranscationStatus //代表了当前的事务,可以提交,回滚。 



  PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。 



  我们使用编程式的事务管理流程可能如下: 



  (1) 声明数据源。 



  (2) 声明一个事务管理类,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等 



  (3) 在我们的代码中加入事务处理代码: 



TransactionDefinition td = new TransactionDefinition(); 

TransactionStatus ts = transactionManager.getTransaction(td); 

try{ 

 //do sth 

 transactionManager.commit(ts); 

}catch(Exception e){transactionManager.rollback(ts);} 



  使用Spring提供的事务模板TransactionTemplate: 



void add() 



 transactionTemplate.execute( new TransactionCallback(){ 

  pulic Object doInTransaction(TransactionStatus ts) 

  { //do sth} 

 } 





  TransactionTemplate也是为我们省去了部分事务提交、回滚代码;定义事务模板时,需注入事务管理对象。 



  3、Spring声明式事务处理 



  Spring声明式事务处理也主要使用了IoC,AOP思想,提供了TransactionInterceptor拦截器和常用的代理类TransactionProxyFactoryBean,可以直接对组件进行事务代理。 



  使用TransactionInterceptor的步骤: 



  (1)定义数据源,事务管理类 



  (2)定义事务拦截器,例如: 



<bean id = "transactionInterceptor" 

class="org.springframework.transaction.interceptor.TransactionInterceptor"> 

<property name="transactionManager"><ref bean="transactionManager"/></property> 

<property name="transactionAttributeSource"> 

<value> 

com.test.UserManager.*r=PROPAGATION_REQUIRED 

</value> 

</property> 

</bean> 



  (3)为组件声明一个代理类:ProxyFactoryBean 



<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean"> 

<property name="proxyInterfaces"><value>com.test.UserManager</value></property> 

<property name="interceptorNames"> 

<list> 

<idref local="transactionInterceptor"/> 

</list> 

</property> 

</bean> 



  使用TransactionProxyFactoryBean: 



<bean id="userManager" 

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 

<property name="transactionManager"><ref bean="transactionManager"/></property> 

<property name="target"><ref local="userManagerTarget"/></property> 

<property name="transactionAttributes"> 

<props> 

<prop key="insert*">PROPAGATION_REQUIRED</prop> 

<prop key="update*">PROPAGATION_REQUIRED</prop> 

<prop key="*">PROPAGATION_REQUIRED,readOnly</prop> 

</props> 

</property> 

</bean> 



  TransactionProxyFactoryBean只是为组件的事务代理,如果我们要给组件添加一些业务方面的验证等,可以使用TransactionTemplate加拦截器方式,为组件添加多个拦截器,spring AOP中提供了三类Advice,即前增强,后增强,抛出异常时的增强,可以灵活使用。

spring是如何管理 事务的的更多相关文章

  1. (转)使用Spring注解方式管理事务与传播行为详解

    http://blog.csdn.net/yerenyuan_pku/article/details/52885041 使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional ...

  2. spring管理事务

    2.1 事务管理器 Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现. Spring事务管理器 ...

  3. Spring框架系列(六)--事务Transaction

    本文绝大部分内容为转载,原文地址:https://blog.csdn.net/trigl/article/details/50968079 除此之外,后面还有延伸内容 事务在企业日常开发中几乎是一定会 ...

  4. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  5. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  6. spring aop 声明式事务管理

    一.声明式事务管理的概括 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一. Spring的声明式事务顾名思义就是采用声明 ...

  7. Spring AOP /代理模式/事务管理/读写分离/多数据源管理

    参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...

  8. Spring中的事物管理,用 @Transactional 注解声明式地管理事务

    事物: 事务管理是企业级应用程序开发中必不可少的技术,  用来确保数据的 完整性和 一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的四 ...

  9. Spring中的Jdbc事务管理

    Spring提供了对事务的声明式事务管理,只需要在配置文件中做一些配置,即可把操作纳入到事务管理当中,解除了和代码的耦合. Spring声明式事务管理,核心实现就是基于Aop. Spring声明式事务 ...

随机推荐

  1. 简单RPC实现之Netty实现

    所谓RPC就是远程方法调用(Remote  Process Call ),简单的来说就是通过MQ,TCP,HTTP或者自己写的网络协议来传输我要调用对方的什么接口,对方处理之后再把结果返回给我.就这么 ...

  2. 【一天一道LeetCode】#345. Reverse Vowels of a String

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...

  3. 取KindEditor中的textarea的值区不到的解决方案,固定kindEditor的高度

     可以通过下面的方式取到textarea的值 var content = $(document.getElementsByTagName('iframe')[0].contentWindow.do ...

  4. iOS中分段控制器与UIScrollView结合使用

    指定根视图: // 设置window的根视图控制器 self.window.rootViewController = [[UINavigationController alloc] initWithR ...

  5. MongoDB分组

    MongoDB三种分组方式 group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) [简单分组实测150W 12.5s] mapreduce(基于js引擎,单线程执行,效率较低,适合用做后 ...

  6. 导航控制器 UI_08(上)

    主要内容:UINavigationController 重要:属性传值(向后一个界面传值).代理传值(向前相邻的界面传值).单例传值(不相邻的界面向前传值) 1.UINavigationControl ...

  7. 【翻译】如何创建Ext JS暗黑主题之一

    原文:How to Create a Dark Ext JS Theme– Part 1 概述 我是不是都要演示我的Spotifinder Ext JS应用程序.它是一个很酷的应用程序,可连接到Las ...

  8. Could not find property 'outputFile

    * What went wrong: A problem occurred configuring project ':app'. > Could not find property 'outp ...

  9. Eclipse 创建 Maven 项目、Maven JavaWeb 项目

    Eclipse 创建 Maven 项目         新建一个maven项目          (默认)(如果不行第一个Create a simple ... 也选中) 默认         Jav ...

  10. python的join(string)函数

    join是字符串操作函数,操作的也是字符串. key="\t".join(('a','b','c')) result= key.split("\t") prin ...