rc級別 避免髒讀的實現(LBCC MVCC)

2021-08-15 15:04:53 字數 1874 閱讀 3245

兩種方式:

lbcc和mvcc

先看lbcc:

從此隔離級別效果入手:事務只能讀其他事務已提交的的記錄。

資料庫事務隔離級別的實現,innodb 支援行級鎖,寫時加的是行級排他鎖(x lock),那麼當其他事務訪問另乙個事務正在update (除select操作外其他操作本質上都是寫操作)的同一條記錄時,事務的讀操作會被阻塞。所以只能等到記錄(

其實是索引上的鎖

)上的排他鎖釋放後才能進行訪問,也就是事務提交的時候。這樣確實能實現read commited隔離級別效果。

資料庫這樣做確實可以實現 

事務只能讀其他事務已提交的的記錄

的效果,但是這是很低效的一種做法,為什麼呢?因為對於大部分應用來說,讀操作是多於寫操作的,當寫操作加鎖時,那麼讀操作全部被阻塞,這樣會導致應用的相應能力受資料庫的牽制。

寫、加排他鎖-公升級後的當前讀加共享鎖或排他鎖 - 阻塞

mvcc:

mysql對於大量的rc級別快照讀操作,考慮效能,使用mvcc實現

那就是 innodb 的輔助打得好,因為內部使用了 mvcc 機制,實現了一致性非阻塞讀,大大提高了併發讀寫效率,寫不影響讀,且讀到的事記錄的映象版本。

那具體是如何實現的呢:

2.mvcc 實現的依賴項

mvcc 在mysql 中的實現依賴的是 undo log 與 read view。

1.undo

log:

undo log

中記錄的是資料表記錄行的多個版本,也就是事務執行過程中的回滾段,其實就是

mvcc

中的一行原始資料的多個版本映象資料。

2.read

view

:主要用來判斷當前版本資料的可見性。

3.undo log

undo log是為回滾而用,具體內容就是copy事務前的資料庫內容(行)到undo buffer,在適合的時間把undo buffer中的內容重新整理到磁碟。undo buffer與redo buffer一樣,也是環形緩衝,但當緩衝滿的時候,undo buffer中的內容會也會被重新整理到磁碟;與redo log不同的是,磁碟上不存在單獨的undo log檔案,所有的undo log均存放在主ibd資料檔案中(表空間),即使客戶端設定了每表乙個資料檔案也是如此。

我們通過行的更新過程來看下undo log 是如何形成的?

3.1 行的更新過程

下面演示下事務對某行記錄的更新過程:

初始資料行

f1~f6是某行列的名字,1~6是其對應的資料。後面三個隱含字段分別對應該行的事務號和回滾指標,假如這條資料是剛insert的,可以認為id為1,其他兩個欄位為空。

2.事務1更改該行的各字段的值

當事務1更改該行的值時,會進行如下操作:

用排他鎖鎖定該行

記錄redo log

把該行修改前的值copy到undo log,即上圖中下面的行

修改當前行的值,填寫事務編號,使回滾指標指向undo log中的修改前的行

3.事務2修改該行的值

與事務1相同,此時undo log,中有有兩行記錄,並且通過回滾指標連在一起。

事務的隔離級別演示 避免髒讀,演示不可重複讀發生

開啟兩個視窗a,b 設定a視窗的隔離級別為read committed set session transaction isolation level read committed 分別在兩個視窗中開啟事務 start transaction 在b視窗中完成轉賬 update account set...

MYSQL事件隔離級別以及復讀,幻讀,髒讀的理解

另乙個事務修改了資料,但尚未提交,而本事務中的select會讀到這些未被提交的資料 髒讀 隔離級別最低,併發效能高 本事務讀取到的是最新的資料 其他事務提交後的 問題是,在同乙個事務裡,前後兩次相同的select會讀到不同的結果 不重複讀 會出現不可重複讀 幻讀問題 鎖定正在讀取的行 在同乙個事務裡...

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

什麼是事務?事務,即資料庫事務。是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。通常,事務的正確執行會使資料庫從一種狀態轉換為另一種狀態。事務的特性 acid原則 原子性 atomicity 即不可分割性,事務要麼全執行 要麼全不執行。一致性 consistency 事務的...