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. Handler,MessageQueue Loop 和Message的原理解析

    先介绍和handler一起工作的几个组件 Handler的方法介绍 代码示例 package liu.peng.weather; import java.util.Timer; import java ...

  2. (八十八)VFL语言初步 - 实现布局

    [基本语法] VFL的语法为H:和V:开头,代表水平和垂直. 接下来如果要涉及距离,使用|-x-,x为距离的点数. 对于视图,用[ ]包围,例如[blueView]. ①下面的语句实现了blueVie ...

  3. Socket编程实践(13) --UNIX域协议

    UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答 ...

  4. iOS中 UIToolBar 技术分享

    UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏.当设置UIToolBar显示,或者存在UITabBarController且tabbar被隐藏的时候 ...

  5. c++友元函数与友元类

    友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...

  6. ECMAScript 6之变量的解构赋值

    1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...

  7. Python学习笔记 - function调用和定义

    调用函数: #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 函数调用 >>> abs(100) 100 >>> a ...

  8. 7、Libgdx网络操作

    (官网:www.libgdx.cn) Libgdx包含了一些跨平台的网络操作类,这些类在Gdx.net中. 特性 跨平台HTTP请求 多平台TCP C/S Socket支持(可配置) TCP C/S优 ...

  9. Dynamics CRM ADFS及IFD部署后延长系统注销时间

    Dynamics CRM 部署IFD后,一段时间后登陆状态会失效,系统会提示让你重新登陆,可以通过延长失效时间来规避 在 powershell中执行如下指令 Set-ADFSRelyingPartyT ...

  10. Leetcode_101_Symmetric Tree

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42087039 Given a binary tree, c ...