深入了解事務的隔離機制

2022-10-06 21:45:26 字數 1385 閱讀 7644

深入了解一下事務的隔離機制(在之前資料庫入門階段並沒有提到)我們說了,事務之間是相互隔離互不干擾的,那麼如果出現了下面的情況,會怎麼樣呢:

當兩個事務同時在執行,並且同時在操作同乙個資料,這樣很容易出現併發相關的問題,比如乙個事務先讀取了某條資料,而另乙個事務此時修改了此資料,當前乙個事務緊接著再次讀取時,會導致和前一次讀取的資料不一致,這就是一種典型的資料虛讀現象。

因此,為了解決這些問題,事務之間實際上是存在一些隔離級別的:

我們依次來看看,不同的隔離級別會導致什麼問題。首先是讀未提交級別,此級別屬於最低級別,相當於各個事務共享乙個快取區域,任何事務的操作都在這裡進行。那麼它會導致以下問題:

也就是說,事務a最後得到的實際上是乙個毫無意義的資料(事務b已經回滾了)我們稱此資料為"髒資料",這種現象稱為髒讀

我們接著來看讀已提交級別,事務只能讀取其他事務已經提交的內容,相當於直接從資料中讀取資料,這樣就可以避免髒讀問題了,但是它還是存在以下問題:

這正是我們前面例子中提到的問題,雖然它避免了髒讀問題,但是如果事件b修改並提交了資料,那麼實際上事務a之前讀取到的資料依然不是最新的資料,直接導致兩次讀取的資料不一致,這種現象稱為虛讀也可以稱為不可重複讀

因此,下乙個隔離級別可重複讀就能夠解決這樣的問題(mysql的預設隔離級別),它規定在其他事務執行時,不允許修改資料,這樣,就可以有效地避免不可重複讀的問題,但是這樣就一定安全了嗎?

這裡僅僅是禁止了事務執行過程中的update操作,但是它並沒有禁止insert這類操作,因此,如果事務a執行過程中事務b插入了新的資料,那麼a這時是毫不知情的,比如:

兩個人同時報名乙個活動,兩個報名的事務同時在進行,但是他們一開始讀取到的人數都是5,而這時,它們都會認為報名成功後人數應該變成6,而正常情況下應該是7,因此這個時候就發生了資料的幻讀現象。

因此,要解決這種問題,只能使用最後一種隔離級別序列化來實現了,每個事務不能同時進行,直接避免所有併發問題,簡單粗暴,但是效率爆減,並不推薦。

最後總結三種情況:

(對於虛讀和幻讀的區分:虛讀是某個資料前後讀取不一致,幻讀是整個表的記錄數量前後讀取不一致)

最後這張圖,請務必記在你的腦海,記在你的心中,記在你的全世界:

Mysql深入了解 事務

mysql是預設開啟事務,自動提交的 原子性 要麼都成功要麼都失敗 一致性 事務前後資料的完整性要保持一致 賬前後都是1000 永續性 一旦事務提交,那麼它對資料庫中的對應資料的狀態的變更就會永久儲存到資料庫中。即使資料庫崩潰,一旦重啟就會恢復到事務提交後的結果 隔離性 事務的隔離性是多個使用者併發...

理解事務的隔離性

理解事務的隔離性 事務是以可控的方式對資料資源進行訪問的一組操作。其屬性包括原子性 一致性 隔離性和永續性,也就是常說的acid。其中,隔離性是針對資料資源的併發訪問,規定了各個事務之間相互影響的程度。個人認為這是事務的4個特性裡面,比較難理解的乙個。事實上,事務的隔離性可以分為4種型別的隔離級別 ...

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...