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.pswp.cn/news/259583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259583.shtml
英文地址,請注明出處:http://en.pswp.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)…