Spring 事物的隔離級別

前言:最近在看spring的事物
一、Spring事務(wù)隔離級別
image.png
  1. ISOLATION_DEFAULT: 默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別。
  2. ISOLATION_READ_UNCOMMITTED: 未提交讀,允許一個事務(wù)讀取另外一個事務(wù)未提交的數(shù)據(jù),或造成臟讀、幻讀、不可重復(fù)讀。
  3. ISOLATION_COMMITTED: 提交讀,保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取。另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。防止臟讀。
  4. ISOLATION_RETETABLE_READ: 可重復(fù)讀,可以防止臟讀、不可重復(fù)讀,但是還會造成幻讀。(在可重復(fù)讀(REPEATABLE READS)隔離級別中,基于鎖機(jī)制并發(fā)控制的DBMS需要對選定對象的讀鎖(read locks)和寫鎖(write locks)一直保持到事務(wù)結(jié)束,但不要求“范圍鎖(range-locks)”,因此可能會發(fā)生“幻影讀(phantom reads)”
    在該事務(wù)級別下,保證同一個事務(wù)從開始到結(jié)束獲取到的數(shù)據(jù)一致。這是Mysql的默認(rèn)事務(wù)級別。)
  5. ISOLATION_SERIALIZABLE: 串行事務(wù),事務(wù)串行執(zhí)行,防止臟讀、不可重復(fù)讀、幻讀。
  • 事物的隔離級別造成的問題
問題 描述
臟讀 一個事物讀到另一個事物未提交的更新數(shù)據(jù)。所謂臟讀,就是指事物A讀到了事物B還沒有提交的數(shù)據(jù),比如銀行取錢,事物A開啟事物,此時切換到事物B,事物B開啟事物 -> 取走100元,事物A讀取的肯定是數(shù)據(jù)庫里面的原始數(shù)據(jù),因為事物B取走了100塊,并沒有提交,數(shù)據(jù)庫里面的賬戶余額肯定還是原始余額,這就是臟讀
幻讀 是指當(dāng)事物不是獨(dú)立執(zhí)行時發(fā)生的一種現(xiàn)象。例如第一個事物對一個表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時,第二個事物也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會發(fā)生操作第一個事物的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好像發(fā)生幻覺一樣
不可重復(fù)讀 在一個事物里面的操作中發(fā)現(xiàn)了未被操作的數(shù)據(jù)。比方說在同一個事物中先后執(zhí)行兩條一模一樣的select語句,期間在此次事物中沒有執(zhí)行過任何DDL語句,但先后得到的結(jié)果不一致,這就是不可重復(fù)讀
隔離級別 臟讀可能性 不可重復(fù)讀可能性 幻讀可能性 加鎖讀
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
二、Spring事務(wù)傳播機(jī)制
image.png
  • (需要事務(wù)加入)
     1. REQUIRED: 如果當(dāng)前有事務(wù)就加入事務(wù),如果沒有事務(wù)則創(chuàng)建一個新的。
     2. REQUIRES_NEW: 創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

  • (嵌套事務(wù))
     3. NESTED: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行。如果沒有事務(wù),相當(dāng)于REQUIRED。

  • (支持,如果有就支持,如果沒有就算了)
     4.SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù)。如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式進(jìn)行。

  • (不支持)
     5. NOT_SUPPORTS: 以非事務(wù)方式運(yùn)行。如果當(dāng)前有事務(wù),則把當(dāng)前事務(wù)掛起。

  • (強(qiáng)制性的,一定要有,沒有就拋異常)

    1. MANDATORY:如果當(dāng)前存在事務(wù),則運(yùn)行在當(dāng)前事務(wù)中。如果沒有事務(wù),則拋出異常。
  • (從不,比NOT_SUPPORT更硬,直接異常)
     7. NEVER: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常,即父級方法必須無事務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容