主要介紹了MySQL多版本并發(fā)控制MVCC的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
事務(wù)隔離級別設(shè)置
set global transaction isolation level read committed; //全局的
set session transaction isolation level read committed; //當(dāng)前會話
修改事務(wù)提交方式(是否自動提交,mysql默認(rèn)自動提交)
SET AUTOCOMMIT = 1; //自動提交,為0手動提交
不同數(shù)據(jù)庫引擎MVCC模式各不相同,典型有樂觀和悲觀并發(fā)控制。
innodb
說明:
InnoDB的MVCC,是通過在每行記錄后面保存兩個隱藏的列來實現(xiàn)的。這兩個列,一個保存了行的創(chuàng)建時間,一個保存行的過期時間(或刪除時間)。當(dāng)然存儲的并不是實際的時間值,而是系統(tǒng)版本號(system version number).每開始個新的事務(wù),系統(tǒng)版本號都會自動遞增。事務(wù)開始時刻的系統(tǒng)版本號會作為事務(wù)的版本號,用來和查詢到的
SELECT
InnoDB會根據(jù)以下兩個條件檢查每行記錄:
a. InnoDB只查找版本早于當(dāng)前事務(wù)版本的數(shù)據(jù)行(也就是,行的系統(tǒng)版本號小于或等于事務(wù)的系統(tǒng)版本號),這樣可以確保事務(wù)讀取的行,要么是在事務(wù)開始前已經(jīng)存在的,要么是事務(wù)自身插人或者修改過的。
b.行的刪除版本要么未定義,要么大于當(dāng)前事務(wù)版本號。這可以確保事務(wù)讀取到的行,在事務(wù)開始之前未被刪除。
只有符合上述兩個條件的記錄,才能返回作為查詢結(jié)果。
INSERT
InnoDB為新插人的每行 保存當(dāng)前系統(tǒng)版本號作為行版本號。
DELETE
InnoDB為刪除的每行保存當(dāng)前系統(tǒng)版本號作為行刪除標(biāo)識。
UPDATE
InnoDB為插人行新記錄,保存當(dāng)前系統(tǒng)版本號作為行版本號,同時保存當(dāng)前系統(tǒng)版本號到原來的行作為行刪除標(biāo)識。
注意:
MVCC只在REPEATABLE READ 和READ COMMITED 兩個隔離級別下工作。其他兩個隔離級別都和MVCC不兼容法,因為READ UNCOMITTED總是讀取最新的數(shù)據(jù)行,而不是符合當(dāng)前事務(wù)版本的數(shù)據(jù)行。而SERIALIZABLE則會對所有讀取的行都加鎖。
查看當(dāng)表的狀態(tài)
show table status like 'task'\G;
不可重復(fù)讀:實現(xiàn)了事務(wù)的隔離性,但兩次讀取同一條數(shù)據(jù)的時候發(fā)現(xiàn)數(shù)據(jù)不一致了。臟讀、不可重復(fù)讀、幻讀
臟讀:當(dāng)前事務(wù)讀到了另一個事務(wù)未提交的狀態(tài),事務(wù)沒有實現(xiàn)隔離。
幻讀:兩次查詢同一批數(shù)據(jù),發(fā)現(xiàn)有新數(shù)據(jù)被插入,主要是因為中途有其他事務(wù)對數(shù)據(jù)集進(jìn)行了插入操作。(加了間隙鎖解決該問題)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,
- mysql group_concat 實現(xiàn)把分組字段寫成一行的方法
- mysql數(shù)據(jù)庫實現(xiàn)多表關(guān)聯(lián)統(tǒng)計、子查詢統(tǒng)計示例
- MySQL InnoDB數(shù)據(jù)庫如何保證事務(wù)特性示例詳解
- 數(shù)據(jù)庫 MySQL8.0+常用命令及操作命令詳解
- Mysql8.0.17數(shù)據(jù)庫安裝圖文教程
- SQL Server 2000/2005/2008刪除或壓縮數(shù)據(jù)庫日志的方
- SQL Server數(shù)據(jù)庫查看login所授予的具體權(quán)限問題
- SQL Server數(shù)據(jù)庫怎么找出一個表包含的頁信息(Page)
- Windows server 2016服務(wù)器上安裝oracle數(shù)據(jù)庫的教程
- SQL Server數(shù)據(jù)庫基礎(chǔ)之行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)