在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手動提交...