




已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Spring事務的傳播行為和隔離級別7個傳播行為,4個隔離級別, Spring事務的傳播行為和隔離級別transaction behavior and isolated level2007-08-01 16:33事務的傳播行為和隔離級別transaction behavior and isolated levelSpring中事務的定義:一、Propagation :key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:PROPAGATION_REQUIRED-支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 PROPAGATION_SUPPORTS-支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。 PROPAGATION_MANDATORY-支持當前事務,如果當前沒有事務,就拋出異常。 PROPAGATION_REQUIRES_NEW-新建事務,如果當前存在事務,把當前事務掛起。 PROPAGATION_NOT_SUPPORTED-以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。 PROPAGATION_NEVER-以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。 很多人看到事務的傳播行為屬性都不甚了解,我昨晚看了j2ee without ejb的時候,看到這里也不了解,甚至重新翻起數據庫系統(tǒng)的教材書,但是也沒有找到對這個的分析。今天搜索,找到一篇極好的分析文章,雖然這篇文章是重點分析PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRED_NESTED的=解惑 spring 嵌套事務 /* * date 2006-11-24 * note 轉載自/topic/35907?page=1*/ *TransactionDefinition 接口定義*/* * Support a current transaction, create a new one if none exists. * Analogous to EJB transaction attribute of the same name. * This is typically the default setting of a transaction definition. */ int PROPAGATION_REQUIRED = 0; /* * Support a current transaction, execute non-transactionally if none exists. * Analogous to EJB transaction attribute of the same name. * Note: For transaction managers with transaction synchronization, * PROPAGATION_SUPPORTS is slightly different from no transaction at all, * as it defines a transaction scopp that synchronization will apply for. * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc) * will be shared for the entire specified scope. Note that this depends on * the actual synchronization configuration of the transaction manager. * see org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization */ int PROPAGATION_SUPPORTS = 1; /* * Support a current transaction, throw an exception if none exists. * Analogous to EJB transaction attribute of the same name. */ int PROPAGATION_MANDATORY = 2; /* * Create a new transaction, suspend the current transaction if one exists. * Analogous to EJB transaction attribute of the same name. * Note: Actual transaction suspension will not work on out-of-the-box * on all transaction managers. This in particular applies to JtaTransactionManager, * which requires the javax.transaction.TransactionManager to be * made available it to it (which is server-specific in standard J2EE). * see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */ int PROPAGATION_REQUIRES_NEW = 3; /* * Execute non-transactionally, suspend the current transaction if one exists. * Analogous to EJB transaction attribute of the same name. * Note: Actual transaction suspension will not work on out-of-the-box * on all transaction managers. This in particular applies to JtaTransactionManager, * which requires the javax.transaction.TransactionManager to be * made available it to it (which is server-specific in standard J2EE). * see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */ int PROPAGATION_NOT_SUPPORTED = 4; /* * Execute non-transactionally, throw an exception if a transaction exists. * Analogous to EJB transaction attribute of the same name. */ int PROPAGATION_NEVER = 5; /* * Execute within a nested transaction if a current transaction exists, * behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB. * Note: Actual creation of a nested transaction will only work on specific * transaction managers. Out of the box, this only applies to the JDBC * DataSourceTransactionManager when working on a JDBC 3.0 driver. * Some JTA providers might support nested transactions as well. * see org.springframework.jdbc.datasource.DataSourceTransactionManager */ int PROPAGATION_NESTED = 6; *在這篇文章里,他用兩個嵌套的例子輔助分析,我這里直接引用了。*sample*ServiceA /* * 事務屬性配置為 PROPAGATION_REQUIRED */ void methodA() ServiceB.methodB(); ServiceB /* * 事務屬性配置為 PROPAGATION_REQUIRED */ void methodB() *1: PROPAGATION_REQUIRED 加入當前正要執(zhí)行的事務不在另外一個事務里,那么就起一個新的事務 比如說,ServiceB.methodB的事務級別定義為PROPAGATION_REQUIRED, 那么由于執(zhí)行ServiceA.methodA的時候, ServiceA.methodA已經起了事務,這時調用ServiceB.methodB,ServiceB.methodB看到自己已經運行在ServiceA.methodA 的事務內部,就不再起新的事務。而假如ServiceA.methodA運行的時候發(fā)現自己沒有在事務中,他就會為自己分配一個事務。 這樣,在ServiceA.methodA或者在ServiceB.methodB內的任何地方出現異常,事務都會被回滾。即使ServiceB.methodB的事務已經被 提交,但是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾 2: PROPAGATION_SUPPORTS 如果當前在事務中,即以事務的形式運行,如果當前不再一個事務中,那么就以非事務的形式運行 3: PROPAGATION_MANDATORY 必須在一個事務中運行。也就是說,他只能被一個父事務調用。否則,他就要拋出異常 4: PROPAGATION_REQUIRES_NEW 這個就比較繞口了。 比如我們設計ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW, 那么當執(zhí)行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起,ServiceB.methodB會起一個新的事務,等待ServiceB.methodB的事務完成以后, 他才繼續(xù)執(zhí)行。他與PROPAGATION_REQUIRED 的事務區(qū)別在于事務的回滾程度了。因為ServiceB.methodB是新起一個事務,那么就是存在 兩個不同的事務。如果ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會回滾的。如果ServiceB.methodB失敗回滾, 如果他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然可能提交。 5: PROPAGATION_NOT_SUPPORTED 當前不支持事務。比如ServiceA.methodA的事務級別是PROPAGATION_REQUIRED ,而ServiceB.methodB的事務級別是PROPAGATION_NOT_SUPPORTED , 那么當執(zhí)行到ServiceB.methodB時,ServiceA.methodA的事務掛起,而他以非事務的狀態(tài)運行完,再繼續(xù)ServiceA.methodA的事務。 6: PROPAGATION_NEVER 不能在事務中運行。假設ServiceA.methodA的事務級別是PROPAGATION_REQUIRED, 而ServiceB.methodB的事務級別是PROPAGATION_NEVER , 那么ServiceB.methodB就要拋出異常了。 7: PROPAGATION_NESTED 理解Nested的關鍵是savepoint。他與PROPAGATION_REQUIRES_NEW的區(qū)別是,PROPAGATION_REQUIRES_NEW另起一個事務,將會與他的父事務相互獨立, 而Nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。也就是說,如果父事務最后回滾,他也要回滾的。 而Nested事務的好處是他有一個savepoint。 * ServiceA /* * 事務屬性配置為 PROPAGATION_REQUIRED */ void methodA() try /savepoint ServiceB.methodB(); /PROPAGATION_NESTED 級別 catch (SomeException) / 執(zhí)行其他業(yè)務, 如 ServiceC.methodC(); * 也就是說ServiceB.methodB失敗回滾,那么ServiceA.methodA也會回滾到savepoint點上,ServiceA.methodA可以選擇另外一個分支,比如 ServiceC.methodC,繼續(xù)執(zhí)行,來嘗試完成自己的事務。 但是這個事務并沒有在EJB標準中定義。 二、Isolation Level(事務隔離等級): 1、Serializable:最嚴格的級別,事務串行執(zhí)行,資源消耗最大; 2、REPEATABLE READ:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。 3、READ COMMITTED:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用于大多數系統(tǒng)。 4、Read Uncommitted:保證了讀取過程中不會讀取到非法數據。隔離級別在于處理多事務的并發(fā)問題。 我們知道并行可以提高數據庫的吞吐量和效率,但是并不是所有的并發(fā)事務都可以并發(fā)運行,這需要查看數據庫教材的可串行化條件判斷了。 這里就不闡述。 我們首先說并發(fā)中可能發(fā)生的3中不討人喜歡的事情 1: Dirty reads-讀臟數據。也就是說,比如事務A的未提交(還依然緩存)的數據被事務B讀走,如果事務A失敗回滾,會導致事務B所讀取的的數據是錯誤的。 2: non-repeatable reads-數據不可重復讀。比如事務A中兩處讀取數據-total-的值。在第一讀的時候,total是100,然后事務B就把total的數據改成200,事務A再讀一次,結果就發(fā)現,total竟然就變成200了,造成事務A數據混亂。 3: phantom reads-幻象讀數據,這個和non-repeatable reads相似,也是同一個事務中多次讀不一致的問題。但是non-repeatable reads的不一致是因為他所要取的數據集被改變了(比如total的數據),但是phantom reads所要讀的數據的不一致卻不是他所要讀的數據集改變,而是他的條件數據集改變。比如Select account.id where =ppgogo*,第一次讀去了6個符合條件的id,第二次讀取的時候,由于事務b把一個帳號的名字由dd改成ppgogo1,結果取出來了7個數據。 Dirty reads non-repeatable reads phantom reads Serializable 不會 不會 不會 REPEATABLE READ 不會 不會 會 READ COMMITTED 不會 會 會 Read Uncommitted 會 會 會 三、readOnly 事務屬性中的readOnly標志表示對應的事務應該被最優(yōu)化為只讀事務。這是一個最優(yōu)化提示。在一些情況下,一些事務策略能夠起到顯著的最優(yōu)化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)時避免dirty checking(試圖“刷新”)。四、Timeout 在事務屬性中還有定義“timeout”值的選項,指定事務超時為幾秒。在JTA中,這將被簡單地傳遞到J2EE服務器的事務協調程序,并據此得到相應的解釋。Spring2.5常用配置備份一、啟動Spring2.5監(jiān)聽,讓web項目整合spring在web.xml中配置,代碼如下:1. 2. contextConfigLocation3. 4. classpath:beans.xml 5. 6. 7. 8. 9. org.springframework.web.context.ContextLoaderListener10. 注:如果在支持低版本的Servlet的web容器中,可以采用Servlet形式,把上面的換成下面的,優(yōu)點是可以設置自啟動順序,代碼如下:1. 2. 3. contextLoaderServlet4. org.springframework.web.context.ContextLoaderServlet5. 26. 二、關于配置日志文件Log4J由于WebApplicationContext需要使用日志功能,用戶可以將Log4J的配置文件放到類路徑WEB-INF/classes下,這Log4J引擎可以順利啟動。如果將Log4J配置文件放在其他位置,用戶還需要在web.xml中指定Log4J的位置,spring也Log4J提供了兩種方式,跟上面類似,有監(jiān)聽模式和自啟動模式(Servlet模式)監(jiān)聽模式:1. 2. log4jConfigLocation3. 4. /WEB-INF/perties 5. 6. 7. 8. 9. org.springframework.web.util.Log4jConfigListener10. 而自啟動模式跟上面一樣把listen換成servlet,如:1. 2. log4jConfigServlet3. org.springframework.web.util.Log4jConfigServlet4. 15. 下面是一個簡單的perties文件:1. log4j.rootLogger=INFO,A1 2. log4j.appender.A1=org.apache.log4j.ConsoleAppender 3. log4j.appender.A1.layout=org.apache.log4j.PatternLayout 4. log4j.appender.A1.layout.ConversionPattern=%d%5p%t(%F:%L)-%m%n注意:如果手動配置Log4J,則先要讓日志文件Log4J先啟動,再spring的監(jiān)聽或啟動。三、使用外部屬性文件和配置數據源a、使用外部屬性文件 1. 2. 3. 4. classpath:com/baobaotao/place/perties5. 6. 7. 8. 而在spring2.5的版本中提供了一種更簡便的方式,如:1. 這樣以后要使用屬性文件中的資源時,可以使用$屬性名來獲得。b、常用數據源的配置第一種是:DBCP數據源,(需要加入2個jar文件,在spring中的lib下jakarta-commons/commons-dbcp.jar和commons-pools.jar)主要配置如下:1. 2. 3. 4. 5. 6. 7. 第二種是:c3p0數據源,跟第一種一個類型,需加入c3p0.jar包。第三種是:JNDI數據源,配置在高性能的應用服務器(如WebLogic、WebSphere等)1. 2. 3. 從spring2.0開始提供jee命名空間,可以簡化配置如下:1. 四、事務管理配置a、Spring JDBC 和 iBatis事務管理器的配置1. 2. 3. b、Hibernate3以上事務管理器的配置(先要集成hibernate,再配置事務管理器)1. 2. 3. 4. 5. 6. classpath:product.hbm.xml7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 五、配置tx/aop聲明式事務 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 六、使用基于Transactional注解形式聲明事務在bean.xml通過一 行xml配置就可以,如1. 提示:如果你用 transactionManager 來定義 PlatformTransactionManager bean的名字的話,你就可以忽略 標簽里的 transaction-manager 屬性。這樣在需要業(yè)務的接口或實現類中加上Transactional就可以了,詳細見文檔。七、spring的字符過濾器的配置在web.xml中增加如下過濾器1. 2. characterEncodingFilter3. org.springframework.web.filter.CharacterEncodingFilter4. 5. encoding6. UTF-87. 8. 9. 10. 11. characterEncodingFilter12. /*13. Spring的事務處理Spring的事務處理機制,給我們編程帶來了極大的方便,One-Transaction-Per-Request的實現模式,是本人最為欣賞的!在之前開始接觸Spring的時候,為了實現事務處理的模式,我們在聲明事務的時候,一般是這么做首先聲明一個事務模板, PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly 接著,聲明一個service類,使用Spring的事務處理模板 這種聲明方式我足足用了兩年,自從與李剛才師接觸后,買了在他著作的Spring 2.0寶典,學習之后,發(fā)現原來Spring也可以這么配置基于AOP技術的事務處理方式,首先聲明一個事務的攔截器PROPAGATION_REQUIREDPROPAGATION_REQUIREDPROPAGATION_REQUIREDPROPAGATION_REQUIREDPROPAGATION_REQUIRED,readOnly接著,聲明一個自動代理*ServicetransactionInterceptor該自動代理的意思是,所有以Service的bean,都是需要使用該攔截器。以下是ServiceBean的配置這種配置方式簡單得多,雖然對于有些程序員覺得使用copy & paste,其實都是一差不多,但是,配置文件至少可以少一大半,方便維護!1 、什么是Spring事務處理? 什么是事務處理我就不想回答了。 Spring 的事務處理,可以說是 Spring AOP 的一種實現。因為事務處理是所謂方面( Aspect )的一個子集。因此默認情況下,事務處理是利用 Java 動態(tài)代理機制實現的,這樣就必須先定義一個接口,然后再編寫實現;而對于沒有接口的 Javabean ,則通過 CGLIB 實現。這部分是 Spring AOP 部分的內容。 2 、兩種事務處理方式 和 EJB 一樣, Spring 也提供兩種事務處理方式,一種是編程式事務處理;一種是聲明式事務處理。 何時使用什么 如果需要大量的事務處理,就用聲明式事務處理,如果很少的事務處理,就用編程式 二、詳細 編程式事務處理與聲明式事務處理 (一)編程式事務處理 1 、使用TransactionTemplate進行事務處理(Spring進行commit和rollback) ( 1 )使用事務處理的類 import javax.sql.DataSource; import org.springframework.jdbc.core.*; import org.springframework.transaction.*; import org.springframework.dao.*; public class bookDAO private DataSource dataSource;/ 依賴注入 dataSource ,管理數據庫 private Platfo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 病毒與生物安全法律法規(guī)合同
- 壁畫與古代漁業(yè)技術合同
- 保險業(yè)保險業(yè)風險報告編制合同
- 休閑農業(yè)園區(qū)場地調研與農產品加工合同
- 老人病患護理課件
- 翻譯相關課件
- 美術用具介紹課件
- 單位工作總結怎樣寫
- 服裝生產車間安全培訓
- 安全生產法7個職責
- 鎂合金半固態(tài)注射成型技術的研究與發(fā)展
- 企業(yè)管理咨詢重點總結
- 2025年廣東深圳美術館選聘專業(yè)技術崗位工作人員1人歷年自考難、易點模擬試卷(共500題附帶答案詳解)
- 腹股溝疝診療指南(2024版)
- 2025年吉林司法警官職業(yè)學院單招職業(yè)技能測試題庫完整版
- 2024年上海中學自主招生數學試卷
- 秋季開學班主任培訓
- 護理實習生職業(yè)規(guī)劃
- 安徽省合肥市普通高中六校聯盟2023-2024學年高一下學期期末聯考試題 化學 含解析
- 9《天上有顆南仁東星》 【知識精研】八年級上冊同步備課
- 小號獨奏名曲100首
評論
0/150
提交評論