資料庫中的 髒讀,幻讀,不可重複讀

2021-08-29 14:48:55 字數 1859 閱讀 7007

資料庫帶來的併發問題包括: 1.

丟失或覆蓋更新。

(幻像讀)

2.未確認的相關性(髒讀)。 3.

不一致的分析(非重複讀)。

<?xml:namespace prefix = o ?>

詳細描述如下:

當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。

e.g.事務a

和事務b

同時修改某行的值,

1.事務

a將數值改為

1並提交

2.事務

b將數值改為

2並提交。

這時資料的值為

2,事務

a所做的更新將會丟失。

解決辦法:對行加鎖,只允許併發乙個更新事務。

當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。第二個事務正在讀取的資料還沒有確認並且可能由更新此行的事務所更改。

e.g.

1.mary

的原工資為

1000,

財務人員將

mary

的工資改為了

8000(

但未提交事務)

2.mary

讀取自己的工資

,發現自己的工資變為了

8000

,歡天喜地! 3.

而財務發現操作有誤,回滾了事務

,mary

的工資又變為了

1000

像這樣,mary

記取的工資數

8000

是乙個髒資料。

解決辦法:如果在第乙個事務提交前,任何其他事務不可讀取其修改過的值,則可  以避免該問題。

當第二個事務多次訪問同一行而且每次讀取不同的資料時,會發生不一致的分析問題。不一致的分析與未確認的相關性類似,因為其它事務也是正在更改第二個事務正在讀取的資料。然而,在不一致的分析中,第二個事務讀取的資料是由已進行了更改的事務提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次資訊都由其它事務更改;因而該行被非重複讀取。

在乙個事務中前後兩次讀取的結果並不致,導致了不可重複讀。

e.g.

1.在事務1中,

mary

讀取了自己的工資為

1000,

操作並沒有完成 2.

在事務2

中,這時財務人員修改了

mary

的工資為

2000,

並提交了事務.

3.在事務1中,

mary

再次讀取自己的工資時,工資變為了

2000

解決辦法:如果只有在修改事務完全提交之後才可以讀取資料,則可以避免該問題。

四.幻像讀

當對某行執行插入或刪除操作,而該行屬於某個事務正在讀取的行的範圍時,會發生幻像讀問題。事務第一次讀的行範圍顯示出其中一行已不復存在於第二次讀或後續讀中,因為該行已被其它事務刪除。同樣,由於其它事務的插入操作,事務的第二次或後續讀顯示有一行已不存在於原始讀中。

e.g.

目前工資為

1000

的員工有

10人。

1.事務

1,讀取所有工資為

1000

的員工。

2.這時事務2向

employee

表插入了一條員工記錄,工資也為

1000

3.事務

1再次讀取所有工資為

1000

的員工共讀取到了

11條記錄,

解決辦法:如果在操作事務完成資料處理之前,任何其他事務都不可以新增新資料,則可避免該問題

資料庫幻讀 髒讀 不可重複讀

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

資料庫髒讀 不可重複讀 幻讀

資料庫髒讀 不可重複讀 幻讀 1.髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。2.不可重複讀 是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個...

資料庫髒讀,幻讀,不可重複讀

指乙個事務a正在訪問資料,並且對該資料進行了修改,但是這種修改還沒有提交到資料庫中 也可能因為某些原因rollback了 這時候另外乙個事務b也訪問這個資料,然後使用了這個被a修改的資料,那麼這個資料就是髒的,並不是資料庫中真實的資料。這就被稱作髒讀。解決辦法 把資料庫事務隔離級別調整到read c...