mysql資料庫 MVCC(多版本併發控制)(1)

2021-10-07 02:34:09 字數 1573 閱讀 3941

在mysql

的眾多儲存引擎中,只有

innodb

支援事務,所有這裡說的事務隔離級別指的是

innodb

下的事務隔離級別。

事務隔離級別,以及導致的問題

隔離級別 定義

髒讀 幻讀

不可重複度

讀未提交

乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀、幻讀、不可重複讀問題。 √

√ √讀已提交

乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀和幻讀問題。 ×

√ √可重複讀

同乙個事務中多次讀取相同的資料返回的結果是一樣的。其避免了髒讀和不可重複讀問題,但幻讀依然存在。 ×

× √序列化

事務序列執行。避免了以上所有問題。 ×

× ×在

mysql

中,預設的隔離級別是

repeatable-read

(可重複讀),並且解決了幻讀問題。簡單的來說,

mysql

的預設隔離級別解決了髒讀、幻讀、不可重複讀問題。

不可重複讀重點在於

update

和delete

,而幻讀的重點在於

insert

插入。

mvcc

的全稱是

「多版本併發控制

」。這項技術使得

innodb

的事務隔離級別下執行一致性讀操作有了保證,即為了查詢一些正在被另乙個事務更新的行,並且可以看到它們被更新之前的值。這是乙個可以用來增強併發性的強大的技術,因為這樣的一來的話查詢就不用等待另乙個事務釋放鎖。

在innodb

中,給每行增加兩個隱藏欄位來實現

mvcc

,乙個用來記錄資料行的建立時間,另乙個用來記錄行的過期時間(刪除時間)。在實際操作中,儲存的並不是時間,而是事務的版本號,每開啟乙個新事務,事務的版本號就會遞增。 對於

mysql

資料庫預設的隔離級別(

repeatable read

)下,增刪查改變成了這樣

select

讀取建立版本小於或等於當前事務版本號,並且刪除版本為空或大於當前事務版本號的記錄。這樣可以保證在讀取之前記錄是存在的。

insert

將當前事務的版本號儲存至行的建立版本號

update

新插入一行,並以當前事務的版本號作為新行的建立版本號,同時將原記錄行的刪除版本號設定為當前事務版本號

delete

將當前事務的版本號儲存至行的刪除版本號

快照讀:讀取的是快照版本,也就是歷史版本

當前讀:讀取的是最新版本

普通的select

就是快照讀,而

update

、delete

、insert

、select ...  lock in share mode

、select ... for update

是當前讀。

參考部落格:mysql

的mvcc

(多版本併發控制)

1.redo log、undo log和bin log三者區別

MySQL資料庫MVCC多版本併發控制簡介

mvcc multiversion concurrency control 即多版本併發控制技術,它使得大部分支援行鎖的事務引擎,不再單純的使用行鎖來進行資料庫的併發控制,取而代之的是把資料庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高資料庫系統的併發效能 inn...

mysql多版本併發控制MVCC

innodb的mvcc是通過在每行記錄的後面儲存兩個隱藏的列來實現的,這兩個列乙個儲存行的建立時間,乙個儲存行的過期時間。但是並不是儲存時間而是儲存版本號,每開始乙個新的事務,版本號會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到每行記錄的版本號進行比較。select innod...

mysql多版本併發控制MVCC

set global transaction isolation level read committed 全域性的 set session transaction isolation level read committed 當前會話 複製 set autocommit 1 自動提交,為0手動提交...