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

2022-08-03 06:24:13 字數 1726 閱讀 8308

**自

一、髒讀、不可重複讀、幻讀

1、髒讀:髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。

例如:張三的工資為5000,事務a中把他的工資改為8000,但事務a尚未提交。

與此同時,

事務b正在讀取張三的工資,讀取到張三的工資為8000。

隨後,事務a發生異常,而回滾了事務。張三的工資又回滾為5000。

最後,事務b讀取到的張三工資為8000的資料即為髒資料,事務b做了一次髒讀。

2、不可重複讀:是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第乙個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀。

例如:在事務a中,讀取到張三的工資為5000,操作沒有完成,事務還沒提交。

與此同時,

事務b把張三的工資改為8000,並提交了事務。

隨後,在事務a中,再次讀取張三的工資,此時工資變為8000。在乙個事務中前後兩次讀取的結果並不致,導致了不可重複讀。

3、幻讀:是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第乙個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣。

例如:目前工資為5000的員工有10人,事務a讀取所有工資為5000的人數為10人。

此時,事務b插入一條工資也為5000的記錄。

這是,事務a再次讀取工資為5000的員工,記錄為11人。此時產生了幻讀。

4、提醒

不可重複讀的重點是修改:

同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了

幻讀的重點在於新增或者刪除:

同樣的條件,第 1 次和第 2 次讀出來的記錄數不一樣

5、第一類丟失更新

a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。例如:

這時候取款事務a撤銷事務,餘額恢復為1000,這就丟失了更新。

6、第二類丟失更新

a事務覆蓋b事務已經提交的資料,造成b事務所做的操作丟失

為了解決上述問題,資料庫通過鎖機制解決併發訪問的問題。根據鎖定物件不同:分為行級鎖和表級鎖;根據併發事務鎖定的關係上看:分為共享鎖定和獨佔鎖定,共享鎖定會防止獨佔鎖定但允許其他的共享鎖定。而獨佔鎖定既防止共享鎖定也防止其他獨佔鎖定。為了更改資料,資料庫必須在進行更改的行上施加行獨佔鎖定,insert、update、delete和selsct for update語句都會隱式採用必要的行鎖定。

但是直接使用鎖機制管理是很複雜的,基於鎖機制,資料庫給使用者提供了不同的事務隔離級別,只要設定了事務隔離級別,資料庫就會分析事務中的sql語句然後自動選擇合適的鎖。

不同的隔離級別對併發問題的解決情況如圖:

注意:事務的隔離級別和資料庫併發性是成反比的,隔離級別越高,併發性越低。

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

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

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

事務的隔離性 mysql是乙個客戶端 伺服器架構的軟體,對於同乙個伺服器來說,可以有若干個客戶端與之連線,每個客戶端與伺服器連線上之後,就可以稱之為乙個會話 session 每個客戶端都可以在自己的會話中向伺服器發出請求語句,乙個請求語句可能是某個事務的一部分,也就是對於伺服器來說可能同時處理多個事...

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

我們知道,事務的四大特性是a 原子性 c 一致性 i 隔離性 d 永續性 事務隔離級別就是為了滿足隔離性的機制。在併發場景下,如果沒有一定的處理方式,就會出現髒讀 幻讀 不可重複讀三類問題。髒讀 事務a在執行過程中,修改了某資料,事務b讀取了修改後的資料,然後事務a進行了回滾操作,這個時候事務b讀取...