Spring事務管理及與mybatis整合的事務管理_第1頁
Spring事務管理及與mybatis整合的事務管理_第2頁
Spring事務管理及與mybatis整合的事務管理_第3頁
Spring事務管理及與mybatis整合的事務管理_第4頁
Spring事務管理及與mybatis整合的事務管理_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數據訪問事務處理in Spring+Mybatis3.0事務-保證了用戶的每一次操作都是可靠的,即使出現了異常的訪問,也不至于破壞后臺數據的完整性;Java事務簡介事務必須符合ISO/IEC所定制的ACID原則1)A(atomicity):原子性在事務執行的過程中,任何的失敗就將導致事務的任何修改失效,2)C(consistency)L致性事務回滾時,事務所執行的內容必須恢復到初始狀態,即事務執行前的狀態3)I(isolation):隔離性事務執行過程中對數據的修改,在提交之前的數據對其他事務不可見4)D(durability):持久性已經提交的數據在事務執行失敗時,數據的狀態都是正確的.事務

2、分類:全局事務(分布式事務):由應用服務器來管理(如JTA洞時可以用于多個事務性的資源;本地事務本地事務和資源相關,主要通過JDBC來實現在實際應用中,存在一種容器管理事務,容器事務主要是由javaEE應用服務器提供,容器事務大多給予JTA完成,事實 上這是在容器中覆蓋了JDBC和JTA事務.事務特性分析(use spring)TransactionDefinition接口來定義事務屬性。Code:public interface TransactionDefinition(int getIsolationLevel();int getPropagationBehavior();int get

3、Timeout();boolean isReadOnly();)事務機制a)事務隔離級別隔離級別是指若干個并發的事務之間的隔離程度。TransactionDefinition接口中定義了五個表示隔離級別的常量:TransactionDefinition.ISOLATION_DEFAULT認值):表示使用底層數據庫的默認隔離級別。對大部分 數據庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTEDTransactionDefinition.ISOLATION_READ_UNCOMMITTED該隔離級別表示一個事務可以讀取另一個事務修改但還

4、沒有提交的數據。該級別不能防止臟讀和不可重復讀,因此很少使用該隔離級別。TransactionDefinition.ISOLATION_READ_COMMITTED該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。TransactionDefinition.PROPAGATION_MANDATORYTransactionDefinition.ISOLATION_REPEATABLE_REA或 隔離級別表示一個事務在整個過程中可以多次 重復執行某個查詢,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數據滿足該查詢,這些新增 的記錄也會被

5、忽略。該級別可以防止臟讀和不可重復讀。TransactionDefinition.ISOLATION_SERIALIZABLE所有的事務依次逐個執行,這樣事務之間就完全不可能產 生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況 下也不會用到該級別。隔離級別定義了事務與事務之間的隔離程度。隔離級別與并發性是互為矛盾的:隔離程度越高,數據庫的并發性越差;隔離程度越低,數據庫的并發性越好。ANSI/ISO SQL9赫準定義了一些數據庫操作的隔離級別:未提交讀(read uncommitted)提交讀(read committed)重復讀(repeatab

6、le read)序列化(serializable)通過一些現象,可以反映出隔離級別的效果。這些現象有:更新丟失(lost update):當系統允許兩個事務同時更新同一數據是,發生更新丟失。臟讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。非重復讀(nonrepeatable read):同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或,除,每次返回不同 的結果集, 此時發生非重復讀。(A transaction rereads data it has previously read and finds that another committed t

7、ransaction hasmodified or deleted the data.)幻讀(phantom read):同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操,,次返回不同的結果集, 仕匕時發生幻像讀。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that anothercommitted transaction has inserted additional rows that satisfy the condit

8、ion.)隔離級別影響部分:isoXation XevelDirty ReadNOJIRCQeat able ReadPhantom ReadRead uncoimiitted.Foss ikLePassIblePossibleRead cotnniltteciNot peasiblePo2s iblaPassibleRepeatatole re adNot poss ibleNot pQissitolePossitileSerializahleNot passibleNot possibleMatleb)事務傳播行為所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時

9、有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:TransactionDefinition.PROPAGATION_REQUIRE D如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。TransactionDefinition.PROPAGATION_REQUIRES_NEW創建一個新的事務,如果當前存在事務,則把當前事務掛起。TransactionDefinition.PROPAGATION_SUPPORT S如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。Tran

10、sactionDefinition.PROPAGATION_NOT_SUPPORTE D以非事務方式運行,如果當前存在事務,則把當前事務掛起。TransactionDefinition.PROPAGATION_NEVER以非事務方式運行,如果當前存在事務,則拋出異常。TransactionStatus如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。TransactionDefinition.PROPAGATION_NESTED如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATI

11、ON_REQUIRED此處涉及到【嵌套事務】內部事務依賴于外部事務外部事務的提交和回滾直接影響到內部事務(內部事務不是獨立的)c)事務超時指一個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在TransactionDefinition中以int的值來表示超時時間,其單位是秒。,d)事務的只讀屬性(readOnly)對事務性資源進行只讀操作或者是讀寫操作。所謂事務性資源就是指那些被事務管理的資源,比如數據源、JMS資源,以及自定義的事務性資源等等。如果確定只對事務性資源進行只讀操作,那么我們可以將事務標志為只讀的,以提高事務處理的性能。在TransactionDe

12、finition中以boolean類型來表示該事務是否只 讀。e)事務的回滾規則通常情況下,如果在事務中拋出了未檢查異常(繼承自RuntimeException的異常),則默認將回滾事務。如果沒有拋出任何異常,或者拋出了已檢查異常,則仍然提交事務。這通常也是大多數開發者希望的處理方式,也 是EJB中的默認處理方式。但是,我們可以根據需要人為控制事務在拋出某些未檢查異常時任然提交事務,或者 在拋出某些已檢查異常時回滾事務。TransactionDefinition、PlatformTransactionManager、TransactionStatus事務管理,其實就是“按照給定的事務規則來執行

13、提交或者回滾操作”。“給定的事務規則”就是用TransactionDefinition表示的,“按照,來執行提交或者回滾操作”便是用PlatformTransactionManager來表示,而TransactionStatus用于表示一個運行著的事務的狀態。PlatformTransactionManagerPlatformTransactionManager 用于執行具體的事務操作。Public interface PlatformTransactionManagerTransactionStatus getTransaction(TransactionDefinition definit

14、ion)throws TransactionException;void commit(TransactionStatus status)throws TransactionException;void rollback(TransactionStatus status)throws TransactionException;根據底層所使用的不同的持久化API或框架,PlatformTransactionManager的主要實現類大致如下:DataSourceTransactionManager:適用于使用JDBC和 舊atis進行數據持久化操作的情況。HibernateTransaction

15、Manager:適用于使用Hibernate進行數據持久化操作的情況。JpaTransactionManager:適用于使用JPA進行數據持久化操作的情況。另夕卜還有JtaTransactionManager、JdoTransactionManager、JmsTransactionManager等等。如果我們使用JTA進行事務管理,我們可以通過JNDI和Spring的JtaTransactionManager來獲取一個容器管理的DataSource。JtaTransactionManager不需要知道DataSource和其他特定的資源,因為它將使用容器提供的全局事務管理。而 對于其他事務管理

16、器,比如DataSourceTransactionManager,在定義時需要提供底層的數據源作為其屬性,也就是DataSource。與HibernateTransactionManager對應的是SessionFactory,與JpaTransactionManager對應的是EntityManagerFactory等等。PlatformTransactionManager.getTransaction(方法返回一個Transactionstatus對象。返回的Transactionstatus對象可能代表一個新的或已經存在的事務(如果在當前調用堆棧有一個符合條件的事務)。Transacti

17、onstatus接口提供了一個簡單的控制事務執行和查詢事務狀態的方法。public interface TransactionStatus( boolean isNewTransaction(); void setRollbackOnly(); booleanisRollbackOnly(); Spring的編程式事務管理在Spring出現以前,編程式事務管理對基于POJO的應用來說是唯一選擇。用過Hibernate的人都知道,需要在代碼中顯式調用beginTransaction()、commit()、rollback()等事務管理相關的方法,這就是編程式事務管理。通過Spring提供的事 務

18、管理API,我們可以在代碼中靈活控制事務的執行。在底層,Spring仍然將事務操作委托給底層的持久化框架來執行。聲明式事務管理(方便代碼維護,無污染,無重復代碼,但是粒度控制不夠)Spring的聲明式事務管理在底層是建立在AOP的基礎之上的。其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只 需在配置文件中做相關的事務規則聲明(或通過等價的基于標注的方式),便可以將事務規則應用到業務邏輯中。因為事務 管理本身就是一個典型

19、的橫切邏輯,正是AOP的用武之地。通常情況下,筆者強烈建議在開發中使用聲明式事務,不僅因為其簡單,更主要是因為這樣使得純業務代碼不被污染, 極大方便后期的代碼維護。基于transactionIntercepter PROPAGATION_REQUIRED,-XXException,+xxxException 我們配置了一個Transactioninterceptor來定義相關的事務規則,他有兩個主要的屬性:一個是transactionManager ,用來指定一個事務管理器,并將具體事務相關的操作委托給它;另一個是Properties類型的transactionAttributes屬性,它主

20、要用來定義事務規則,該屬性的每一個鍵值對中,鍵指定的是方法名,方法名可以使用通配符,而值就表示相應方法的所應用的事務屬性。指定事務屬性的取值有較復雜的規則:格式:傳播行為,隔離級別,只讀屬性,超時屬性不影響提交的異常,導致回滾的異常傳播行為是唯一必須設置的屬性,其他都可以忽略,Spring為我們提供了合理的默認值。傳播行為的取值必須以“PROPAGATION開頭,具體包括:PROPAGATION_MANDATORY PROPAGATION_NESTE D PROPAGATION_NEVEFPROPAGATION_NOT_SUPPORT EPROPAGATION_REQUIRE吵ROPAGATI

21、ON_REQUIRES_NE W PROPAGATION_SUPPORT買七種取值。隔離級別的取值必須以 “ISOLATION_開頭,具體包括:ISOLATION_DEFAULT ISOLATION_READ_COMMITTEDPROPAGATION_REQUIREDISOLATION_READ_UNCOMMITTE4DISOLATION_REPEATABLE_READSOLATION_SERIALIZABL咪五種取值。如果事務是只讀的,那么我們可以指定只讀屬性,使用“readonly”指定。否則我們不需要設置該屬性。超時屬性的取值必須以“TIMEOUT:開頭,后面跟一個int類型的值,表示超

22、時時間,單位是秒。不影響提交的異常是指,即使事務中拋出了這些類型的異常,事務任然正常提交。必須在每一個異常的名字前面加上+”。異常的名字可以是類名的一部分。比如+RuntimeException”、+tion ”等等。導致回滾的異常是指,當事務中拋出這些類型的異常時,事務將回滾。必須在每一個異常的名字前面加上“-”。異常的名字可以是類名的全部或者部分,比如-RuntimeException”、-tion ”等等。例子:PROPAGATION_REQUIREDSOLATION_READ_COMMITTEpTIMEOUT_2O, +AbcException, +DefException, -Hij

23、Exception基于TransactionProxyFactoryBean的聲明式事務管理前面的聲明式事務雖然好,但是配置文件太多。我們必須針對每一個目標對象配置一個ProxyFactoryBean;另外,雖然可以通過父子Bean的方式來復用TransactionInterceptor的配置,但是實際的復用幾率也不高;這樣,加上目標對象本身,每一個業務類可能需要對應三個配置,隨著業務類的增多,配置文件將會變得越來越龐大,管理配置文件又成了問題。為了緩解這個問題,Spring為我們提供了TransactionProxyFactoryBean,用于將TransactionInterceptor和

24、ProxyFactoryBean的配置合二為一。基丁命名空間的聲明式事務管理前面兩種聲明式事務配置方式奠定了Spring聲明式事務管理的基石。在此基礎上,Spring 2.x弓I入了命名空間,結合使用命名空間,帶給開發人員配置聲明式事務的全新體驗,配置變得更加簡單和靈活。另外,得益于命 名空間的切點表達式支持,聲明式事務也變得更加強大。XML:簡化:基丁Transactional的聲明式事務管理事務配置:bean name =transactionManagerclass =org.springframework.jdbc.datasource.DataSourceTransactionManager啟用注釋:tx:annotation-driv0 OvemdeTra

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論