資料庫隔離級別解決髒讀 不可重複讀 幻讀

2021-10-09 13:40:18 字數 1064 閱讀 8224

髒讀

讀取了未提交的事務。

事務a讀取了事務b中尚未提交的資料。如果事務b回滾,則a讀取使用了錯誤的資料。

解決:如果乙個事務在讀的時候,禁止讀取未提交的事務。

不可重複讀

讀取了提交的新事物,指更新操作。

期望兩次讀的結果一樣,但中途另乙個事務修改了資料並提交了,導致第二次讀的結果變了。

解決:如果乙個事務在讀的時候,禁止任何事務寫。

幻讀也是讀取了提交的新事物,指增刪操作。

不可重複是針對記錄的update操作,只要在記錄上加寫鎖,就可避免;幻讀是對記錄的insert操作,禁止幻讀必須加上全域性的寫鎖。比如在表上加寫鎖。

例:

事務a,先執行:

update

table

set name=

"hky"

where id >

3 事務b,後執行,並且提交:

insert

into

table

values(11

,'uu'

) 事務a,再select一下:

select

*from

table

where id >

3 結果集:11,uu

事務a懵了,我tm剛更新完id>

3的啊?!幻覺?!

由此,也可以看出不可重複讀和幻讀區別,不可重複讀操作是本身記錄讀取產生的,幻讀則是乙個範圍。

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 、read committed 、repeatable read 、serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀這幾類問題。

serializable(序列化)

最高隔離級別。所有事務操作依次順序執行。注意這會導致併發度下降,效能最差。通常會用其他併發級別加上相應的併發鎖機制來取代它。

事務 隔離級別 髒讀 不可重複 幻讀

事務,就是一組運算元據庫的動作集合。如果一組 處理步驟 全部發生或者一步也不執行,我們稱該組處理步驟為乙個事務。當所有的步驟像乙個操作一樣被完整地執行,我們稱該事務被提交。由於其中的一部分或多步執行失敗,導致沒有步驟被提交,則事務必須回滾到最初的系統狀態。二 事務的併發問題 1 髒讀 事務 a讀取了...

資料庫事務隔離級別(髒讀 幻讀 不可重複讀)

自 一 髒讀 不可重複讀 幻讀 1 髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。例如 張三的工資為5000,事務a中把他的工資改為8000,但事務a尚未提交。與此同時,事務b正在讀取張三的工資,讀...

Mysql資料庫隔離級別鎖關係髒讀不可重複讀幻讀

我們在進行資料庫開發時經常會遇到程式事務的相關問題,對於髒讀 幻讀 不可重複讀等問題的處理。資料庫隔離級別以及會出現的問題,如下 隔離級別 資料丟失 髒讀不可重複讀 幻讀讀未提交read uncommitted noyes yesyes 讀已提交 read committed nono yesyes...