Spring 事務隔離級別

更新丟失(Lost Update):兩個事務都企圖去更新一行數據,導致事務拋出異常退出,兩個事務的更新都白費了。

髒數據(Dirty Read):如果第二個應用程序使用了第一個應用程序修改過的數據,而這個數據處於未提交狀態,這時就會發生髒讀。第一個應用程序隨後可能會請求回滾被修改的數據,從而導致第二個事務使用的數據被損壞,即所謂的“變髒”。

不可重讀(Unrepeatable Read):一個事務兩次讀同一行數據,可是這兩次讀到的數據不一樣,就叫不可重讀。如果一個事務在提交數據之前,另一個事務可以修改和刪除這些數據,就會發生不可重讀。

幻讀(Phantom Read):一個事務執行了兩次查詢,發現第二次查詢結果比第一次查詢多出了一行,這可能是因爲另一個事務在這兩次查詢之間插入了新行。

以上就是並行事務處理時常遇到的大致問題。針對這些問題,提出了幾個不同的事務隔離級別,適應特定的環境需要。

具體是:

讀操作未提交(Read Uncommitted):說明一個事務在提交前,其變化對於其他事務來說是可見的。這樣髒讀、不可重讀和幻讀都是允許的。當一個事務已經寫入一行數據但未提交,其他事務都不能再寫入此行數據;但是,任何事務都可以讀任何數據。這個隔離級別使用排寫鎖實現。

讀操作已提交(Read Committed):讀取未提交的數據是不允許的,它使用臨時的共讀鎖和排寫鎖實現。這種隔離級別不允許髒讀,但不可重讀和幻讀是允許的。

可重讀(Repeatable Read):說明事務保證能夠再次讀取相同的數據而不會失敗。此隔離級別不允許髒讀和不可重讀,但幻讀會出現。

可串行化(Serializable):提供最嚴格的事務隔離。這個隔離級別不允許事務並行執行,只允許串行執行。這樣,髒讀、不可重讀或幻讀都不可發生。

Spring框架提供五種隔離級別分別爲
ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
後四種隔離級別具體隔離何種數據讀取
這個默認隔離級別是與具體的數據庫相關的
採取的是具體數據庫的默認隔離級別
不同的數據庫是不一樣的


悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。


樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章