Spring的事務隔離級別和傳播機制

2021-08-07 12:01:37 字數 2563 閱讀 6409

spring

事務隔離級:

spring

有五大隔離級別,其在transactiondefinition介面中定義。看原始碼可知,其默isolation_default(底層資料庫預設級別),其他四個隔離級別跟資料庫隔離級別一致。

1.    

isolation_default

:用底層資料庫的預設隔離級別,資料庫管理員設定什麼就是什麼

2.    

isolation_read_uncommitted(未提交讀)

:最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、髒讀、不可重複讀)

3.    

isolation_read_committed(提交讀)

:乙個事務提交後才能被其他事務讀取到(該隔離級別禁止其他事務讀取到未提交事務的資料、所以還是會造成幻讀、不可重複讀)、sql server預設級別

4.   

isolation_repeatable_read(可重複讀)

:可重複讀,保證多次讀取同乙個資料時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的資料(該隔離基本可防止髒讀,不可重複讀(重點在修改),但會出現幻讀(重點在增加與刪除))(mysql預設級別,更改可通過set transaction isolationlevel 級別)

5.    

isolation_serializable(序列化)

:代價最高最可靠的隔離級別(該隔離級別能防止髒讀、不可重複讀、幻讀)

1.    

丟失更新:兩個事務同時更新一行資料,最後乙個事務的更新會覆蓋掉第乙個事務的更新,從而導致第乙個事務更新的資料丟失,這是由於沒有加鎖造成的;

2.    

幻讀:同樣的事務操作過程中,不同時間段多次(不同事務)讀取同一資料,讀取到的內容不一致(一般是行數變多或變少)。

3.    

髒讀:乙個事務讀取到另外乙個未提及事務的內容,即為髒讀。

4.    

不可重複讀:同一事務中,多次讀取內容不一致(一般行數不變,而內容變了)。

5.    

幻讀與不可重複讀的區別:幻讀的重點在於插入與刪除,即第二次查詢會發現比第一次查詢資料變少或者變多了,以至於給人一種幻象一樣,而不可重複讀重點在於修改,即第二次查詢會發現查詢結果比第一次查詢結果不一致,即第一次結果已經不可重現了。

資料庫隔離級別越高,執行代價越高,併發執行能力越差,因此在實際專案開發使用時要綜合考慮,為了考慮

併發效能

一般使用

提交讀隔離級別,它能避免丟失更新和髒讀,儘管不可重複讀和幻讀不能避免,但可以在可能出現的場合使用悲觀鎖或樂觀鎖來解決這些問題。

傳播行為

:有七大傳播行為,也是在transactiondefinition

介面中定義。

1.   

propagation_required

:支援當前事務,如當前沒有事務,則新建乙個。

2.    

propagation_supports

:支援當前事務,如當前沒有事務,則已非事務性執行(原始碼中提示有個注意點,看不太明白,留待後面考究)。

3.    

propagation_mandatory

:支援當前事務,如當前沒有事務,則丟擲異常(強制一定要在乙個已經存在的事務中執行,業務方法不可獨自發起自己的事務)。

4.    

propagation_requires_new

:始終新建乙個事務,如當前原來有事務,則把原事務掛起。

5.    

propagation_not_supported

:不支援當前事務,始終已非事務性方式執行,如當前事務存在,掛起該事務。

6.    

propagation_never

:不支援當前事務;如果當前事務存在,則引發異常。

7.    

propagation_nested

:如果當前事務存在,則在巢狀事務中執行,如果當前沒有事務,則執行與 propagation_required類似的操作(注意:當應用到jdbc時,只適用jdbc 3.0以上驅動)。

介紹:認為資料在使用過程中,不會被其他程式修改、所以只有在資料提交時才檢測資料是否已經被修改

實現方法 

1.使用版本號:給資料所在表加個字段,記錄資料版本號。提交時檢測版本號與未修改前的版本號一不一致。不一致說明資料已經被其他執行緒修改。  

2.使用時間截:給資料所在表加個字段,記錄時間。提交時檢測時間與取出的時間截一不一致。不一致說明資料已經被其他執行緒修改。

使用場景:如上下級審核檔案。

介紹:悲觀的認為資料提交時會發生併發衝突,遮蔽一切可能違反資料完整性的操作

使用方法:在準備修改某資料時,給該資料加鎖,加鎖失敗說明有人正在占用,成功則修改資料提交,事務完成釋放鎖。

使用場景:資料爭用激烈的環境,以及發生併發衝突時使用鎖保護資料的成本要低於回滾事務的成本的環境中。

注意項:mysql innodb中使用悲觀鎖一定要關閉自動提交屬性,因為mysql預設使用autocommit模式,也就是說,當你執行乙個更新操作後,mysql會立刻將結果進行提交。 set autocommit=0;

原創:

spring事務隔離級別

在spring中定義了5中不同的事務隔離級別 1.isolation default 一般情況下使用這種配置既可 這是乙個platfromtransactionmanager預設的隔離級別,使用資料庫預設的事務隔離級別。2.isolation read uncommitted 4 p l.i f k...

Spring 事務隔離級別

資料庫事務的隔離級別有4種,由低到高分為為read uncomitted,read comitted,repeatable read serializable,而且,在事務的併發操作中可能會出現髒讀,不可重複度,虛讀 幻讀 髒讀 read uncomitted 什麼都防不住 乙個事務讀到另外乙個事務...

Spring事務隔離級別

事務操作可能出現的問題 更新丟失 lost update 當系統允許兩個事務同時更新同一資料時,發生更新丟失。髒讀 dirty read 當乙個事務讀取另乙個事務尚未提交的修改時,產生髒讀。非重複讀 nonrepeatable read 第一次讀 得到乙個結果 再讀,換了乙個結果 幻像 phanto...