日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

spring 事务-使用@Transactional 注解(事务隔离级别)

發(fā)布時(shí)間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring 事务-使用@Transactional 注解(事务隔离级别) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先看下@Transactional可以配制那些參數(shù)及以其所代表的意義。

?

?

isolation

枚舉org.springframework.transaction.annotation.Isolation的值

事務(wù)隔離級(jí)別

noRollbackFor

Class<? extends Throwable>[]

一組異常類,遇到時(shí)不回滾。默認(rèn)為{}

noRollbackForClassName

Stirng[]

一組異常類名,遇到時(shí)不回滾,默認(rèn)為{}

propagation

枚舉org.springframework.transaction.annotation.Propagation的值

事務(wù)傳播行為

readOnly

boolean

事務(wù)讀寫性

rollbackFor

Class<? extends Throwable>[]

一組異常類,遇到時(shí)回滾

rollbackForClassName

Stirng[]

一組異常類名,遇到時(shí)回滾

timeout

?

超時(shí)時(shí)間,以秒為單位

value

String

可選的限定描述符,指定使用的事務(wù)管理器

?


isolation事務(wù)隔離級(jí)別,使用時(shí)一般如下。

?

  • @Transactional(isolation=Isolation.DEFAULT)
  • public void method(){}
  • isolation的參數(shù)有以下五種:

    ?

    1_1、Isolation.DEFAULT:為數(shù)據(jù)源的默認(rèn)隔離級(jí)別

    1_2、isolation=Isolation.READ_UNCOMMITTED:未授權(quán)讀取級(jí)別

    以操作同一行數(shù)據(jù)為前提,讀事務(wù)允許其他讀事務(wù)和寫事務(wù),未提交的寫事務(wù)禁止其他寫事務(wù)(但允許其他讀事務(wù))。此隔離級(jí)別可以防止更新丟失,但不能防止臟讀、不可重復(fù)讀、幻讀。此隔離級(jí)別可以通過“排他寫鎖”實(shí)現(xiàn)。

    1_3、iIsolation.READ_COMMITTED:授權(quán)讀取級(jí)別

    ?

    以操作同一行數(shù)據(jù)為前提,讀事務(wù)允許其他讀事務(wù)和寫事務(wù),未提交的寫事務(wù)禁止其他讀事務(wù)和寫事務(wù)。此隔離級(jí)別可以防止更新丟失、臟讀,但不能防止不可重復(fù)讀、幻讀。此隔離級(jí)別可以通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。

    1_4、iIsolation.REPEATABLE_READ:可重復(fù)讀取級(jí)別

    ?

    以操作同一行數(shù)據(jù)為前提,讀事務(wù)禁止其他寫事務(wù)(但允許其他讀事務(wù)),未提交的寫事務(wù)禁止其他讀事務(wù)和寫事務(wù)。此隔離級(jí)別可以防止更新丟失、臟讀、不可重復(fù)讀,但不能防止幻讀。此隔離級(jí)別可以通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。

    1_5、iIsolation.SERIALIZABLE:序列化級(jí)別

    提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,不能并發(fā)執(zhí)行。此隔離級(jí)別可以防止更新丟失、臟讀、不可重復(fù)讀、幻讀。如果僅僅通過“行級(jí)鎖”是無法實(shí)現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問到。

    隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed。它能夠避免更新丟失、臟讀,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、幻讀這些并發(fā)問題,在可能出現(xiàn)這類問題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。

    有關(guān)事務(wù)的關(guān)鍵字說明如下,說明如下:

    ?

    原子性(Atomicity):

    事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,它對(duì)數(shù)據(jù)庫(kù)的修改要么全部執(zhí)行,要么全部不執(zhí)行。

    一致性(Consistemcy):

    事務(wù)前后,數(shù)據(jù)庫(kù)的狀態(tài)都滿足所有的完整性約束。

    隔離性(Isolation):

    并發(fā)執(zhí)行的事務(wù)是隔離的,一個(gè)不影響一個(gè)。如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請(qǐng)求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)。通過設(shè)置數(shù)據(jù)庫(kù)的隔離級(jí)別,可以達(dá)到不同的隔離效果。

    持久性(Durability):

    在事務(wù)完成以后,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中,并不會(huì)被回滾。

    更新丟失:

    兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),但是第二個(gè)事務(wù)卻中途失敗退出,導(dǎo)致對(duì)數(shù)據(jù)的兩個(gè)修改都失效了。這是因?yàn)橄到y(tǒng)沒有執(zhí)行任何的鎖操作,因此并發(fā)事務(wù)并沒有被隔離開來。

    臟讀:

    臟讀又稱無效數(shù)據(jù)讀出。一個(gè)事務(wù)讀取另外一個(gè)事務(wù)還沒有提交的數(shù)據(jù)叫臟讀。

    例如:事務(wù)T1修改了一行數(shù)據(jù),但是還沒有提交,這時(shí)候事務(wù)T2讀取了被事務(wù)T1修改后的數(shù)據(jù),之后事務(wù)T1因?yàn)槟撤N原因Rollback了,那么事務(wù)T2讀取的數(shù)據(jù)就是臟的。

    不可重復(fù)讀:

    不可重復(fù)讀是指在同一個(gè)事務(wù)內(nèi),兩個(gè)相同的查詢返回了不同的結(jié)果。

    例如:事務(wù)T1讀取某一數(shù)據(jù),事務(wù)T2讀取并修改了該數(shù)據(jù),T1為了對(duì)讀取值進(jìn)行檢驗(yàn)而再次讀取該數(shù)據(jù),便得到了不同的結(jié)果。

    幻讀:

    事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)或者缺少了第一次查詢中出現(xiàn)的數(shù)據(jù)

    例如:系統(tǒng)管理員A將數(shù)據(jù)庫(kù)中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣。這就叫幻讀。

    以上的4種問題(更新丟失、臟讀、不可重復(fù)讀、幻讀)都和事務(wù)的隔離級(jí)別有關(guān)。通過設(shè)置事務(wù)的隔離級(jí)別,可以避免上述問題的發(fā)生。

    ?

    事物傳播行為介紹:

      @Transactional(propagation=Propagation.REQUIRED) :如果有事務(wù), 那么加入事務(wù), 沒有的話新建一個(gè)(默認(rèn)情況下)
      @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個(gè)方法開啟事務(wù)
      @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù)
      @Transactional(propagation=Propagation.MANDATORY) :必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常
      @Transactional(propagation=Propagation.NEVER) :必須在一個(gè)沒有的事務(wù)中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反)
      @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒有聲明事務(wù),那就不用事務(wù).

    ?

    事物超時(shí)設(shè)置:

      @Transactional(timeout=30) //默認(rèn)是30秒

    ?

    事務(wù)隔離級(jí)別:

      @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀) 基本不使用
      @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
      @Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會(huì)出現(xiàn)幻讀)
      @Transactional(isolation = Isolation.SERIALIZABLE):串行化

      MYSQL: 默認(rèn)為REPEATABLE_READ級(jí)別
      SQLSERVER: 默認(rèn)為READ_COMMITTED

      Oracle?默認(rèn)隔離級(jí)別?READ_COMMITTED

    轉(zhuǎn)載于:https://www.cnblogs.com/yuandluck/p/9482173.html

    總結(jié)

    以上是生活随笔為你收集整理的spring 事务-使用@Transactional 注解(事务隔离级别)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。