spring是如何管理 事务的


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,即前增强,后增强,抛出异常时的增强,可以灵活使用。

转载于:https://www.cnblogs.com/baiduligang/p/4246971.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 编译原理 字符串_Java编译原理(javac)

Java中的编译分为两个部分:源码文件编译成字节码文件(前端编译)字节码文件被虚拟机加载以后编译成机器码(后端编译)对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件),第二个步骤开发几乎不会接触,因为这是虚拟机在…

sql2012一段时间无法连接报53错误

2019独角兽企业重金招聘Python工程师标准>>> 解决方案 在sqlserver网络配置下的msqlserver协议下改将ip3改成如下图所示 转载于:https://my.oschina.net/u/2511906/blog/840373

ICE第三篇------一些疑难点

1 间接代理 参考http://blog.sina.com.cn/s/blog_53e8499c0100lkoo.html IceGrid用于支持分布式网络服务应用,一个IceGrid域由一个注册表(Registry)和任何数目的节点(Node)构成。注册表(Registry)和节点(Node)一起合作…

windows phone 8 使用页面传对象的方式 实现页面间的多值传递

在做windows phone 开发的时候,会经常碰到页面间之间的跳转和传递数据,如果传递的值不多,只有两三个,我们通常使用NavigationService.Navigate(new Uri("页面名? Name“”&ID“ ”, UriKind.Relative)); 要是碰到要传递…

php生成图片验证码代码,PHP生成图片验证码以及点击切换的代码

这篇文章主要介绍了PHP生成图片验证码实例,同时介绍了点击切换(看不清&#xff1f;换一张)效果实现方法,需要的朋友可以参考下这里来看下效果:现在让我们来看下 PHP 代码<?php session_start();function random($len) {$srcstr "1a2s3d4f5g6hj8k9qwertyupzxcvbnm&quo…

python 时间日期处理

refer to : http://www.wklken.me/posts/2015/03/03/python-base-datetime.html#datetime-string http://www.cnblogs.com/65702708/archive/2011/04/17/2018936.html http://www.runoob.com/python/python-date-time.html 转载于:https://www.cnblogs.com/qingyuanjushi/p/640…

php 字符型转变为数值,php怎么把字符串转换为数值?

php怎么把字符串转换为数值&#xff1f;下面本篇文章给大家介绍一下PHP把字符串转换为数值的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。PHP中的字符串可以很容易地转换成数值(float / int / double类型)。在大多数用例中&am…

解决rspec 生成报告时报utf-8错误的方法

找到gems\1.9.1\gems\rspec-core-2.14.3\lib\rspec\core\formatters\snippet_extractor.rb文件中的第27行&#xff1a; 在这边记录一下&#xff0c;防止以后再遇到。。。出现这个原因是因为ruby文件用utf-8格式的&#xff0c;但是源码都是GBK处理的&#xff0c;找到\lib\ruby\…

aspose.words复制插入同一word文档中的某个页面

选择word模板 Document doc new Document(Server.MapPath("~\\templet") "\\" name.Name);doc.MailMerge.CleanupOptions doc.MailMerge.CleanupOptions & ~MailMergeCleanupOptions.RemoveUnusedRegions;DocumentBuilder builder new DocumentBu…

开源游戏服务器C#

https://github.com/ScutGame/Scut/wiki转载于:https://www.cnblogs.com/porter/p/6408955.html

EFProf Entity Framework Profile 工具

SQL Server Profiler用来跟踪应用程序发送到SQL Server中的SQL语句&#xff0c;用于检测性能&#xff0c;查找问题。Entity Framework 也有它的跟踪工具EFProf&#xff0c;用于跟踪Entity Framework发送到SQL Server中的SQL语句。 首先在代码中添加对程序集HibernatingRhinos.P…

php面试中的问题,十个值得深思的PHP面试问题

十个值得深思的PHP面试问题过来人在以往的面试中总结的10个值得深思的 PHP 面试问题&#xff0c;希望对你现在的面试有用&#xff0c;少走弯路&#xff0c;更多内容请关注应届毕业生网!Q1第一个问题关于弱类型$str1 yabadabadoo;$str2 yaba;if (strpos($str1,$str2)) {echo &…

Android中ExpandableListView控件基本使用

本文採用一个Demo来展示Android中ExpandableListView控件的使用&#xff0c;如怎样在组/子ListView中绑定数据源。直接上代码例如以下&#xff1a; 程序结构图&#xff1a; layout文件夹下的 main.xml 文件源代码例如以下&#xff1a; <?xml version"1.0" encodi…

【暴力】Codeforces Round #398 (Div. 2) A. Snacktower

题意不复述。 用个bool数组记录一下&#xff0c;如果某一天&#xff0c;当前剩下的最大的出现了的话&#xff0c;就输出一段。 #include<cstdio> using namespace std; int n; bool vis[100010]; int main() { // freopen("a.in","r",stdin);scanf(&…

javascript的对象创建模式---命名空间模式

javascript中对象的概念是很普遍的&#xff0c;对象是是对象&#xff0c;数组是对象&#xff0c;函数也是对象&#xff0c;字符串其实也是对象。常见的对象创建方法有对象字面量、构造函数创建。我们先来看看对象的创建还有哪些更高级的模式。 一、命名空间模式 二、模块模式 三…

把Liststring集合,编程string,并以“,”号分割

List<int> roleIdList GetRoleIdList(user.ID); string roleIdsStr ""; if (roleIdList ! null) {roleIdsStr string.Join(",", roleIdList); } 转载于:https://www.cnblogs.com/lijingran/p/6420364.html

武林外史java游戏,武林外史_网络游戏专区_腾讯游戏频道

1 、武师用防御工具1) 武卫类> 用土布制作的防护工具。阶段图片名称说明1武威带所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率8013013021 %武威甲所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率4160150021 %武威长裤所需功…

简单实现KeyChain实例

目录结构如下&#xff1a; AppDelegate.m 1 //2 // AppDelegate.m3 // KeyChain4 //5 // Created by apple on 14-12-26.6 // Copyright (c) 2014年 ll. All rights reserved.7 //8 9 #import "AppDelegate.h" 10 11 interface AppDelegate () 12 13 end 14 1…

Oracle 建立包 和 包体

--创建包create or replace package pac_stuastype cur_stu is ref cursor;procedure getStu(i in number,cur_stu out cur_stu);end pac_stu;--创建包体create or replace package body pac_stuasprocedure getStu(i in number,cur_stu out cur_stu)asnums number(10);begins…

alibaba fastjson

JSON解析器fastjson&#xff08;阿里巴巴出品&#xff0c;版本1.1.33&#xff09; import com.alibaba.fastjson.JSON; public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArraypublic static final JSONObject parseObject(String text)…