Spring事務(wù)管理的詳細介紹-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“Spring事務(wù)管理的詳細介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Spring事務(wù)管理的詳細介紹”吧!

成都創(chuàng)新互聯(lián)2013年至今,先為泉州等服務(wù)建站,泉州等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為泉州企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

事務(wù)概念回顧

什么是事務(wù)?

事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行.

事物的特性(ACID):

Spring事務(wù)管理的詳細介紹

  1. 原子性: 事務(wù)是最小的執(zhí)行單位,不允許分割。事務(wù)的原子性確保動作要么全部完成,要么完全不起作用;

  2. 一致性: 執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致;

  3. 隔離性: 并發(fā)訪問數(shù)據(jù)庫時,一個用戶的事物不被其他事物所干擾,各并發(fā)事務(wù)之間數(shù)據(jù)庫是獨立的;

  4. 持久性: 一個事務(wù)被提交之后。它對數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。

Spring事務(wù)管理接口介紹

Spring事務(wù)管理接口:

  • PlatformTransactionManager: (平臺)事務(wù)管理器

  • TransactionDefinition: 事務(wù)定義信息(事務(wù)隔離級別、傳播行為、超時、只讀、回滾規(guī)則)

  • TransactionStatus: 事務(wù)運行狀態(tài)

所謂事務(wù)管理,其實就是“按照給定的事務(wù)規(guī)則來執(zhí)行提交或者回滾操作”。

PlatformTransactionManager接口介紹

Spring并不直接管理事務(wù),而是提供了多種事務(wù)管理器 ,他們將事務(wù)管理的職責(zé)委托給Hibernate或者JTA等持久化機制所提供的相關(guān)平臺框架的事務(wù)來實現(xiàn)。 Spring事務(wù)管理器的接口是: org.springframework.transaction.PlatformTransactionManager ,通過這個接口,Spring為各個平臺如JDBC、Hibernate等都提供了對應(yīng)的事務(wù)管理器,但是具體的實現(xiàn)就是各個平臺自己的事情了。

PlatformTransactionManager接口代碼如下:

PlatformTransactionManager接口中定義了三個方法:

Public interface PlatformTransactionManager()...{ 
 // Return a currently active transaction or create a new one, according to the specified propagation behavior(根據(jù)指定的傳播行為,返回當(dāng)前活動的事務(wù)或創(chuàng)建一個新事務(wù)。)
 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 
 // Commit the given transaction, with regard to its status(使用事務(wù)目前的狀態(tài)提交事務(wù))
 Void commit(TransactionStatus status) throws TransactionException; 
 // Perform a rollback of the given transaction(對執(zhí)行的事務(wù)進行回滾)
 Void rollback(TransactionStatus status) throws TransactionException; 
 }

我們剛剛也說了Spring中PlatformTransactionManager根據(jù)不同持久層框架所對應(yīng)的接口實現(xiàn)類,幾個比較常見的如下圖所示

Spring事務(wù)管理的詳細介紹

比如我們在使用JDBC或者iBatis(就是Mybatis)進行數(shù)據(jù)持久化操作時,我們的xml配置通常如下:

    <!-- 事務(wù)管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 數(shù)據(jù)源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

TransactionDefinition接口介紹

事務(wù)管理器接口 PlatformTransactionManager 通過 getTransaction(TransactionDefinition definition) 方法來得到一個事務(wù),這個方法里面的參數(shù)是 TransactionDefinition類 ,這個類就定義了一些基本的事務(wù)屬性。

那么什么是事務(wù)屬性呢?

事務(wù)屬性可以理解成事務(wù)的一些基本配置,描述了事務(wù)策略如何應(yīng)用到方法上。事務(wù)屬性包含了5個方面。

Spring事務(wù)管理的詳細介紹

TransactionDefinition接口中的方法如下:

TransactionDefinition接口中定義了5個方法以及一些表示事務(wù)屬性的常量比如隔離級別、傳播行為等等的常量。

我下面只是列出了TransactionDefinition接口中的方法而沒有給出接口中定義的常量,該接口中的常量信息會在后面依次介紹到。

public interface TransactionDefinition {
 // 返回事務(wù)的傳播行為
 int getPropagationBehavior(); 
 // 返回事務(wù)的隔離級別,事務(wù)管理器根據(jù)它來控制另外一個事務(wù)可以看到本事務(wù)內(nèi)的哪些數(shù)據(jù)
 int getIsolationLevel(); 
 // 返回事務(wù)必須在多少秒內(nèi)完成
 //返回事務(wù)的名字
 String getName();
 int getTimeout(); 
 // 返回是否優(yōu)化為只讀事務(wù)。
 boolean isReadOnly();
}

(1)事務(wù)隔離級別(定義了一個事務(wù)可能受其他并發(fā)事務(wù)影響的程度):

我們先來看一下 并發(fā)事務(wù)帶來的問題 ,然后再來介紹一下 TransactionDefinition 接口 中定義了五個表示隔離級別的常量。

并發(fā)事務(wù)帶來的問題

在典型的應(yīng)用程序中,多個事務(wù)并發(fā)運行,經(jīng)常會操作相同的數(shù)據(jù)來完成各自的任務(wù)(多個用戶對統(tǒng)一數(shù)據(jù)進行操作)。并發(fā)雖然是必須的,但可能會導(dǎo)致一下的問題。

  • 臟讀(Dirty read): 當(dāng)一個事務(wù)正在訪問數(shù)據(jù)并且對數(shù)據(jù)進行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時另外一個事務(wù)也訪問了這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個事務(wù)讀到的這個數(shù)據(jù)是“臟數(shù)據(jù)”,依據(jù)“臟數(shù)據(jù)”所做的操作可能是不正確的。

  • 丟失修改(Lost to modify): 指在一個事務(wù)讀取一個數(shù)據(jù)時,另外一個事務(wù)也訪問了該數(shù)據(jù),那么在第一個事務(wù)中修改了這個數(shù)據(jù)后,第二個事務(wù)也修改了這個數(shù)據(jù)。這樣第一個事務(wù)內(nèi)的修改結(jié)果就被丟失,因此稱為丟失修改。

  • 例如:事務(wù)1讀取某表中的數(shù)據(jù)A=20,事務(wù)2也讀取A=20,事務(wù)1修改A=A-1,事務(wù)2也修改A=A-1,最終結(jié)果A=19,事務(wù)1的修改被丟失。

  • 不可重復(fù)讀(Unrepeatableread): 指在一個事務(wù)內(nèi)多次讀同一數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時,另一個事務(wù)也訪問該數(shù)據(jù)。那么,在第一個事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改導(dǎo)致第一個事務(wù)兩次讀取的數(shù)據(jù)可能不太一樣。這就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的情況,因此稱為不可重復(fù)讀。

  • 幻讀(Phantom read): 幻讀與不可重復(fù)讀類似。它發(fā)生在一個事務(wù)(T1)讀取了幾行數(shù)據(jù),接著另一個并發(fā)事務(wù)(T2)插入了一些數(shù)據(jù)時。在隨后的查詢中,第一個事務(wù)(T1)就會發(fā)現(xiàn)多了一些原本不存在的記錄,就好像發(fā)生了幻覺一樣,所以稱為幻讀。

不可重復(fù)度和幻讀區(qū)別:

不可重復(fù)讀的重點是修改,幻讀的重點在于新增或者刪除。

例1(同樣的條件, 你讀取過的數(shù)據(jù), 再次讀取出來發(fā)現(xiàn)值不一樣了 ):事務(wù)1中的A先生讀取自己的工資為 1000的操作還沒完成,事務(wù)2中的B先生就修改了A的工資為2000,導(dǎo) 致A再讀自己的工資時工資變?yōu)?2000;這就是不可重復(fù)讀。

例2(同樣的條件, 第1次和第2次讀出來的記錄數(shù)不一樣 ):假某工資單表中工資大于3000的有4人,事務(wù)1讀取了所有工資大于3000的人,共查到4條記錄,這時事務(wù)2 又插入了一條工資大于3000的記錄,事務(wù)1再次讀取時查到的記錄就變?yōu)榱?條,這樣就導(dǎo)致了幻讀。

隔離級別

TransactionDefinition 接口中定義了五個表示隔離級別的常量:

  • TransactionDefinition.ISOLATION_DEFAULT:使用后端數(shù)據(jù)庫默認的隔離級別,Mysql 默認采用的 REPEATABLE_READ隔離級別 Oracle 默認采用的 READ_COMMITTED隔離級別.

  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級別,允許讀取尚未提交的數(shù)據(jù)變更,可能會導(dǎo)致臟讀、幻讀或不可重復(fù)讀

  • TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生

  • TransactionDefinition.ISOLATION_REPEATABLE_READ: 對同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生。

  • TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級別,完全服從ACID的隔離級別。所有的事務(wù)依次逐個執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級別可以防止臟讀、不可重復(fù)讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

(2)事務(wù)傳播行為(為了解決業(yè)務(wù)層方法之間互相調(diào)用的事務(wù)問題):

當(dāng)事務(wù)方法被另一個事務(wù)方法調(diào)用時,必須指定事務(wù)應(yīng)該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務(wù)中運行,也可能開啟一個新事務(wù),并在自己的事務(wù)中運行。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

支持當(dāng)前事務(wù)的情況:

  • TransactionDefinition.PROPAGATION_REQUIRED: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。

  • TransactionDefinition.PROPAGATION_SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行。

  • TransactionDefinition.PROPAGATION_MANDATORY: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。(mandatory:強制性)

不支持當(dāng)前事務(wù)的情況:

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式運行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

  • TransactionDefinition.PROPAGATION_NEVER: 以非事務(wù)方式運行,如果當(dāng)前存在事務(wù),則拋出異常。

其他情況:

  • TransactionDefinition.PROPAGATION_NESTED: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運行;如果當(dāng)前沒有事務(wù),則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

這里需要指出的是,前面的六種事務(wù)傳播行為是 Spring 從 EJB 中引入的,他們共享相同的概念。而 PROPAGATION_NESTED 是 Spring 所特有的。以 PROPAGATION_NESTED 啟動的事務(wù)內(nèi)嵌于外部事務(wù)中(如果存在外部事務(wù)的話),此時,內(nèi)嵌事務(wù)并不是一個獨立的事務(wù),它依賴于外部事務(wù)的存在,只有通過外部的事務(wù)提交,才能引起內(nèi)部事務(wù)的提交,嵌套的子事務(wù)不能單獨提交。如果熟悉 JDBC 中的保存點(SavePoint)的概念,那嵌套事務(wù)就很容易理解了,其實嵌套的子事務(wù)就是保存點的一個應(yīng)用,一個事務(wù)中可以包括多個保存點,每一個嵌套子事務(wù)。另外,外部事務(wù)的回滾也會導(dǎo)致嵌套子事務(wù)的回滾。

(3) 事務(wù)超時屬性(一個事務(wù)允許執(zhí)行的最長時間)

所謂事務(wù)超時,就是指一個事務(wù)所允許執(zhí)行的最長時間,如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。

(4) 事務(wù)只讀屬性(對事物資源是否執(zhí)行只讀操作)

事務(wù)的只讀屬性是指,對事務(wù)性資源進行只讀操作或者是讀寫操作。所謂事務(wù)性資源就是指那些被事務(wù)管理的資源,比如數(shù)據(jù)源、 JMS 資源,以及自定義的事務(wù)性資源等等。如果確定只對事務(wù)性資源進行只讀操作,那么我們可以將事務(wù)標志為只讀的,以提高事務(wù)處理的性能。在 TransactionDefinition 中以 boolean 類型來表示該事務(wù)是否只讀。

(5) 回滾規(guī)則(定義事務(wù)回滾規(guī)則)

這些規(guī)則定義了哪些異常會導(dǎo)致事務(wù)回滾而哪些不會。默認情況下,事務(wù)只有遇到運行期異常時才會回滾,而在遇到檢查型異常時不會回滾(這一行為與EJB的回滾行為是一致的)。 但是你可以聲明事務(wù)在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。同樣,你還可以聲明事務(wù)遇到特定的異常不回滾,即使這些異常是運行期異常。

TransactionStatus接口介紹

TransactionStatus接口用來記錄事務(wù)的狀態(tài) 該接口定義了一組方法,用來獲取或判斷事務(wù)的相應(yīng)狀態(tài)信息.

PlatformTransactionManager.getTransaction(…) 方法返回一個 TransactionStatus 對象。返回的TransactionStatus 對象可能代表一個新的或已經(jīng)存在的事務(wù)(如果在當(dāng)前調(diào)用堆棧有一個符合條件的事務(wù))。

TransactionStatus接口接口內(nèi)容如下:

public interface TransactionStatus{
 boolean isNewTransaction(); // 是否是新的事物
 boolean hasSavepoint(); // 是否有恢復(fù)點
 void setRollbackOnly(); // 設(shè)置為只回滾
 boolean isRollbackOnly(); // 是否為只回滾
 boolean isCompleted; // 是否已完成
}

到此,相信大家對“Spring事務(wù)管理的詳細介紹”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)建站網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

網(wǎng)頁題目:Spring事務(wù)管理的詳細介紹-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://www.muchs.cn/article40/cdjjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、小程序開發(fā)、移動網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、網(wǎng)站維護、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站