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. android获取设备唯一标示

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  2. scala学习笔记3(trait)

    // trait 类似于 Java8 中可以带 default method 的接口. // trait 中可以带有实现的方法,也可以带有抽象的方法,使用 trait 的方式是 with 而混入类中 ...

  3. Maven原型骨架及常见问题

    关于Maven原型工程的制作就不在这里详细介绍了,具体细节请参考之前的文章:定制Maven原型生成项目 下面分享制作和使用Maven原型工程时碰到的常见问题,以及原型的上传和使用方法. 1.模块路径问 ...

  4. Objc运行时读取和写入plist文件遇到的问题

    下面是本猫保持游戏NPC和物件交互的plist文件: 随着游戏和玩家逐步发生互动,玩家会修改人物和物件的交互的状态.这也是RPG游戏最基本的功能. 在切换每个地图时需要将上一个地图发生的改变存储到pl ...

  5. 1057. Stack (30) - 树状数组

    题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last ...

  6. Android初级教程理论知识(第三章测试&数据存储&界面展现)

    首先介绍单元测试,我在javaweb部分有详细介绍单元测试框架的一篇文章. 可以先看在javaweb中的单元测试详解篇http://blog.csdn.net/qq_32059827/article/ ...

  7. 1020. Tree Traversals (25) -BFS

    题目如下: Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder ...

  8. Eclipse中查看没有源码的Class文件的方法

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...

  9. 【IOS 开发】Object-C 运算符

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41624613 1. 算术运算符 算术运算符 : 加(+), 减(-), 乘(*), ...

  10. 转换xml格式的短信记录

    <?xml version="1.0" encoding="UTF-8"?> <SMSRecord>     <SMS>   ...