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

2021-05-06 14:25:47 字數 2021 閱讀 5409

引用

髒讀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、丟失更新

如果兩個事務都要更新資料庫乙個欄位x,x=100

事務a             事務b

讀取x=100    

讀取x=100

寫入x=x+100

寫入x=x+200

事務結束x=200

事務結束x=300

最後x==300

這種情況事務a的更新就被覆蓋掉了、丟失了。

丟失更新說明事務進行資料庫寫操作的時候可能會出現的問題。

2、不可重複讀

乙個事務在自己沒有更新資料庫資料的情況,同乙個查詢操作執行兩次或多次的結果應該是一致的;如果不一致,就說明為不可重複讀。

還是用上面的例子

事務a             事務b

讀取x=100    

讀取x=100

讀取x=100    

寫入x=x+100

讀取x=200    

事務結束x=200

事務結束x=200

這種情況事務a多次讀取x的結果出現了不一致,即為不可重複讀。

再有一情況就是幻影

事務a讀的時候讀出了15條記錄,事務b在事務a執行的過程中刪除(增加)了1條,事務a再讀的時候就變成了14(16)條,這種情況就叫做幻影讀。

不可重複讀說明了做資料庫讀操作的時候可能會出現的問題。

3、髒讀(未提交讀)

防止乙個事務讀到另乙個事務還沒有提交的記錄。

如:事務a             事務b

讀取x=100

寫入x=x+100

讀取x=200    

事務回滾x=100

讀取x=100    

事務結束x=100

x鎖 排他鎖 被加鎖的物件只能被持有鎖的事務讀取和修改,其他事務無法在該物件上加其他鎖,也不能讀取和修改該物件

s鎖 共享鎖 被加鎖的物件可以被持鎖事務讀取,但是不能被修改,其他事務也可以在上面再加s鎖。

封鎖協議:

一級封鎖協議:

在事務修改資料的時候加x鎖,直到事務結束(提交或者回滾)釋放x鎖。一級封鎖協議可以有效的防止丟失更新,但是不能防止髒讀不可重複讀的出現。

二級封鎖協議:

在一級封鎖的基礎上事務讀資料的時候加s鎖,讀取之後釋放。二級封鎖協議可以防止丟失更新,髒讀。不能防止不可重複讀。

**封鎖協議:

在一級封鎖的基礎上事務讀資料的時候加s鎖,直到事務結束釋放。二級封鎖協議可以防止丟失更新,髒讀,不可重複讀。

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

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

髒讀 不可重複讀 幻讀(虛讀)

事務併發下出現的問題 髒讀 讀取了未提交的新事物,然後被回滾了 mysql不支援髒讀 髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。事務a讀取了事務b中尚未提交的資料。如果事務b回滾,則a讀取使用了錯誤的資料。比如我給你轉了100萬,但是我還沒有提交,此時你查詢自己賬戶,多了100萬...

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

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