什麼是「髒讀」 「不可重複的讀」以及「虛讀」

2021-09-12 04:36:00 字數 2056 閱讀 5549

髒讀dirty   reads:當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說:transaction   1   修改了一行資料,然後   transaction   2   在   transaction   1   還未提交修改操作之前讀取了被修改的行。如果   transaction   1   回滾了修改操作,那麼   transaction   2   讀取的資料就可以看作是從未存在過的。    

不可重複的讀non-repeatable   reads:當事務兩次讀取同一行資料,但每次得到的資料都不一樣時,就會發生這種事件。舉例來說:transaction   1   讀取一行資料,然後   transaction   2   修改或刪除該行並提交修改操作。當   transaction   1   試圖重新讀取該行時,它就會得到不同的資料值(如果該行被更新)或發現該行不再存在(如果該行被刪除)。    

虛讀phantom   read:如果符合搜尋條件的一行資料在後面的讀取操作**現,但該行資料卻不屬於最初的資料,就會發生這種事件。舉例來說:transaction   1   讀取滿足某種搜尋條件的一些行,然後   transaction   2   插入了符合   transaction   1   的搜尋條件的乙個新行。如果   transaction   1   重新執行產生原來那些行的查詢,就會得到不同的行。

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

1.丟失或覆蓋更新。(幻像讀)

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

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

詳細描述如下:

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

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條記錄,

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

什麼是「髒讀」 「不可重複的讀」以及「虛讀」

髒讀dirty reads 當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說 transaction 1 修改了一行資料,然後 transaction 2 在 transaction 1 還未提交修改操作之前讀取了被修改的行。如果 transaction 1 回滾了修改操作,那麼 trans...

髒讀,不可重複的讀,虛讀

引用 髒讀dirty reads 當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說 transaction 1 修改了一行資料,然後 transaction 2 在 transaction 1 還未提交修改操作之前讀取了被修改的行。如果 transaction 1 回滾了修改操作,那麼 tr...

髒讀,不可重複的讀,虛讀

引用 髒讀dirty reads 當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說 transaction 1 修改了一行資料,然後 transaction 2 在 transaction 1 還未提交修改操作之前讀取了被修改的行。如果 transaction 1 回滾了修改操作,那麼 tr...