欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談spring中isolation和propagation的用法

 更新時(shí)間:2020年07月16日 17:34:00   作者:小兵1985  
這篇文章主要介紹了淺談spring中isolation 和propagation的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

可以在XML文件中進(jìn)行配置,下面的代碼是個(gè)示意代碼

<tx:advice id="txAdvice" transaction-manager="txManager">
 <tx:attributes>
 <tx:method name="add*" propagation="REQUIRED" isolation="READ_COMMITTED"/>增加記錄的方法
 <tx:method name="get*" propagation="REQUIRED" isolation="READ_COMMITTED"/>獲取記錄的方法
 <tx:method name="delete*" propagation="REQUIRED" isolation="READ_COMMITTED"/>刪除的方法
 <tx:method name="update*" propagation="REQUIRED" isolation="SERIALIZABLE"/>更改記錄的方法
 </tx:attributes>
 </tx:advice>

下面擴(kuò)展將一下spring里面事務(wù)的傳播屬性和事務(wù)隔離級(jí)別。

一、Propagation (事務(wù)的傳播屬性)

Propagationkey屬性確定代理應(yīng)該給哪個(gè)方法增加事務(wù)行為。這樣的屬性最重要的部份是傳播行為。有以下選項(xiàng)可供使用:

傳播行為

事務(wù)的第一個(gè)方面是傳播行為。傳播行為定義關(guān)于客戶端和被調(diào)用方法的事務(wù)邊界。Spring定義了7中傳播行為。

傳播行為 意義
PROPAGATION_REQUIRES 表示當(dāng)前方法必須在一個(gè)事務(wù)中運(yùn)行。如果一個(gè)現(xiàn)有事務(wù)正在進(jìn)行中,該方法將在那個(gè)事務(wù)中運(yùn)行,否則就要開始一個(gè)新事務(wù)。
PROPAGATION_SUPPORTS 表示當(dāng)前方法不需要事務(wù)性上下文,但是如果有一個(gè)事務(wù)已經(jīng)在運(yùn)行的話,它也可以在這個(gè)事務(wù)里運(yùn)行。
PROPAGATION_MANDATORY 表示該方法必須運(yùn)行在一個(gè)事務(wù)中。如果當(dāng)前沒有事務(wù)正在發(fā)生,將拋出一個(gè)異常。
PROPAGATION_REQUIRES_NEW 表示當(dāng)前方法必須在它自己的事務(wù)里運(yùn)行。一個(gè)新的事務(wù)將被啟動(dòng),而且如果有一個(gè)現(xiàn)有事務(wù)在運(yùn)行的話,則將在這個(gè)方法運(yùn)行期間被掛起。
PROPAGATION_NOT_SUPPORTED 表示當(dāng)前方法不需要事務(wù)性上下文,但是如果有一個(gè)事務(wù)已經(jīng)在運(yùn)行的話,它也可以在這個(gè)事務(wù)里運(yùn)行。
PROPAGATION_NEVER 表示當(dāng)前的方法不應(yīng)該在一個(gè)事務(wù)中運(yùn)行。如果一個(gè)事務(wù)正在進(jìn)行,則會(huì)拋出一個(gè)異常。
PROPAGATION_NESTED 表示如果當(dāng)前正有一個(gè)事務(wù)在進(jìn)行中,則該方法應(yīng)當(dāng)運(yùn)行在一個(gè)嵌套式事務(wù)中。被嵌套的事務(wù)可以獨(dú)立于封裝事務(wù)進(jìn)行提交或回滾。如果封裝事務(wù)不存在,行為就像PROPAGATION_REQUIRES一樣。

傳播規(guī)則回答了這樣一個(gè)問題,就是一個(gè)新的事務(wù)應(yīng)該被啟動(dòng)還是被掛起,或者是一個(gè)方法是否應(yīng)該在事務(wù)性上下文中運(yùn)行。

隔離級(jí)別

聲明式事務(wù)的第二個(gè)方面是隔離級(jí)別。隔離級(jí)別定義一個(gè)事務(wù)可能受其他并發(fā)事務(wù)活動(dòng)活動(dòng)影響的程度。另一種考慮一個(gè)事務(wù)的隔離級(jí)別的方式,是把它想象為那個(gè)事務(wù)對(duì)于事物處理數(shù)據(jù)的自私程度。

在一個(gè)典型的應(yīng)用程序中,多個(gè)事務(wù)同時(shí)運(yùn)行,經(jīng)常會(huì)為了完成他們的工作而操作同一個(gè)數(shù)據(jù)。并發(fā)雖然是必需的,但是會(huì)導(dǎo)致一下問題:

  • 臟讀(Dirty read)-- 臟讀發(fā)生在一個(gè)事務(wù)讀取了被另一個(gè)事務(wù)改寫但尚未提交的數(shù)據(jù)時(shí)。如果這些改變?cè)谏院蟊换貪L了,那么第一個(gè)事務(wù)讀取的數(shù)據(jù)就會(huì)是無效的。
  • 不可重復(fù)讀(Nonrepeatable read)-- 不可重復(fù)讀發(fā)生在一個(gè)事務(wù)執(zhí)行相同的查詢兩次或兩次以上,但每次查詢結(jié)果都不相同時(shí)。這通常是由于另一個(gè)并發(fā)事務(wù)在兩次查詢之間更新了數(shù)據(jù)。
  • 幻影讀(Phantom reads)-- 幻影讀和不可重復(fù)讀相似。當(dāng)一個(gè)事務(wù)(T1)讀取幾行記錄后,另一個(gè)并發(fā)事務(wù)(T2)插入了一些記錄時(shí),幻影讀就發(fā)生了。在后來的查詢中,第一個(gè)事務(wù)(T1)就會(huì)發(fā)現(xiàn)一些原來沒有的額外記錄。

在理想狀態(tài)下,事務(wù)之間將完全隔離,從而可以防止這些問題發(fā)生。然而,完全隔離會(huì)影響性能,因?yàn)楦綦x經(jīng)常牽扯到鎖定在數(shù)據(jù)庫中的記錄(而且有時(shí)是鎖定完整的數(shù)據(jù)表)。侵占性的鎖定會(huì)阻礙并發(fā),要求事務(wù)相互等待來完成工作。

考慮到完全隔離會(huì)影響性能,而且并不是所有應(yīng)用程序都要求完全隔離,所以有時(shí)可以在事務(wù)隔離方面靈活處理。因此,就會(huì)有好幾個(gè)隔離級(jí)別。

隔離級(jí)別 含義
ISOLATION_DEFAULT 使用后端數(shù)據(jù)庫默認(rèn)的隔離級(jí)別。
ISOLATION_READ_UNCOMMITTED 允許讀取尚未提交的更改??赡軐?dǎo)致臟讀、幻影讀或不可重復(fù)讀。
ISOLATION_READ_COMMITTED 允許從已經(jīng)提交的并發(fā)事務(wù)讀取??煞乐古K讀,但幻影讀和不可重復(fù)讀仍可能會(huì)發(fā)生。
ISOLATION_REPEATABLE_READ 對(duì)相同字段的多次讀取的結(jié)果是一致的,除非數(shù)據(jù)被當(dāng)前事務(wù)本身改變??煞乐古K讀和不可重復(fù)讀,但幻影讀仍可能發(fā)生?!?/td>
ISOLATION_SERIALIZABLE 完全服從ACID的隔離級(jí)別,確保不發(fā)生臟讀、不可重復(fù)讀和幻影讀。這在所有隔離級(jí)別中也是最慢的,因?yàn)樗ǔJ峭ㄟ^完全鎖定當(dāng)前事務(wù)所涉及的數(shù)據(jù)表來完成的。

 只讀

聲明式事務(wù)的第三個(gè)特性是它是否是一個(gè)只讀事務(wù)。如果一個(gè)事務(wù)只對(duì)后端數(shù)據(jù)庫執(zhí)行讀操作,那么該數(shù)據(jù)庫就可能利用那個(gè)事務(wù)的只讀特性,采取某些優(yōu)化 措施。通過把一個(gè)事務(wù)聲明為只讀,可以給后端數(shù)據(jù)庫一個(gè)機(jī)會(huì)來應(yīng)用那些它認(rèn)為合適的優(yōu)化措施。由于只讀的優(yōu)化措施是在一個(gè)事務(wù)啟動(dòng)時(shí)由后端數(shù)據(jù)庫實(shí)施的, 因此,只有對(duì)于那些具有可能啟動(dòng)一個(gè)新事務(wù)的傳播行為(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、 ROPAGATION_NESTED)的方法來說,將事務(wù)聲明為只讀才有意義。

此外,如果使用Hibernate作為持久化機(jī)制,那么把一個(gè)事務(wù)聲明為只讀,將使Hibernate的flush模式被設(shè)置為FLUSH_NEVER。這就告訴Hibernate避免和數(shù)據(jù)庫進(jìn)行不必要的對(duì)象同步,從而把所有更新延遲到事務(wù)的結(jié)束。

事務(wù)超時(shí)

為了使一個(gè)應(yīng)用程序很好地執(zhí)行,它的事務(wù)不能運(yùn)行太長時(shí)間。因此,聲明式事務(wù)的下一個(gè)特性就是它的超時(shí)。

假設(shè)事務(wù)的運(yùn)行時(shí)間變得格外的長,由于事務(wù)可能涉及對(duì)后端數(shù)據(jù)庫的鎖定,所以長時(shí)間運(yùn)行的事務(wù)會(huì)不必要地占用數(shù)據(jù)庫資源。這時(shí)就可以聲明一個(gè)事務(wù)在特定秒數(shù)后自動(dòng)回滾,不必等它自己結(jié)束。

由于超時(shí)時(shí)鐘在一個(gè)事務(wù)啟動(dòng)的時(shí)候開始的,因此,只有對(duì)于那些具有可能啟動(dòng)一個(gè)新事務(wù)的傳播行為(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED)的方法來說,聲明事務(wù)超時(shí)才有意義。

回滾規(guī)則

事務(wù)五邊形的對(duì)后一個(gè)邊是一組規(guī)則,它們定義哪些異常引起回滾,哪些不引起。在默認(rèn)設(shè)置下,事務(wù)只在出現(xiàn)運(yùn)行時(shí)異常(runtime exception)時(shí)回滾,而在出現(xiàn)受檢查異常(checked exception)時(shí)不回滾(這一行為和EJB中的回滾行為是一致的)。

不過,也可以聲明在出現(xiàn)特定受檢查異常時(shí)像運(yùn)行時(shí)異常一樣回滾。同樣,也可以聲明一個(gè)事務(wù)在出現(xiàn)特定的異常時(shí)不回滾,即使那些異常是運(yùn)行時(shí)一場(chǎng)。

到此這篇關(guān)于淺談spring中isolation 和propagation的用法的文章就介紹到這了,更多相關(guān)spring isolation  propagation內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring 操作elasticsearch查詢使用方法

    spring 操作elasticsearch查詢使用方法

    本篇文章主要介紹了spring 操作elasticsearch使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析

    Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析

    這篇文章主要介紹了springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot項(xiàng)目中處理返回json的null值(springboot項(xiàng)目為例)

    SpringBoot項(xiàng)目中處理返回json的null值(springboot項(xiàng)目為例)

    本文以spring boot項(xiàng)目為例給大家介紹SpringBoot項(xiàng)目中處理返回json的null值問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下
    2019-10-10
  • SpringMVC教程之json交互使用詳解

    SpringMVC教程之json交互使用詳解

    本篇文章主要介紹了SpringMVC教程之json使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Mybatis-Mapper.xml文件前綴詳解

    Mybatis-Mapper.xml文件前綴詳解

    這篇文章主要介紹了Mybatis-Mapper.xml文件前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳細(xì)講解Java抽象類示例

    詳細(xì)講解Java抽象類示例

    這篇文章主要介紹了 Java抽象類示例,抽象類通常用于定義一些公共的方法和屬性,但是這些方法沒有具體的實(shí)現(xiàn),需要的朋友可以參考下
    2023-05-05
  • redis redisson 集合的使用案例(RList、Rset、RMap)

    redis redisson 集合的使用案例(RList、Rset、RMap)

    這篇文章主要介紹了redis redisson 集合的使用案例(RList、Rset、RMap),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 在Java中如何避免創(chuàng)建不必要的對(duì)象

    在Java中如何避免創(chuàng)建不必要的對(duì)象

    作為Java開發(fā)者,我們每天創(chuàng)建很多對(duì)象,但如何才能避免創(chuàng)建不必要的對(duì)象呢?這需要我們好好學(xué)習(xí),這篇文章主要給大家介紹了關(guān)于在Java中如何避免創(chuàng)建不必要對(duì)象的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Spring中的DeferredImportSelector實(shí)現(xiàn)詳解

    Spring中的DeferredImportSelector實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring中的DeferredImportSelector實(shí)現(xiàn)詳解,兩個(gè)官方的實(shí)現(xiàn)類AutoConfigurationImportSelector和ImportAutoConfigurationImportSelector都是Spring Boot后新增的實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • 淺談SpringBoot @Autowired的兩種注入方式

    淺談SpringBoot @Autowired的兩種注入方式

    本文主要介紹了兩種SpringBoot @Autowired注入方式,具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06

最新評(píng)論