?在看MVCC之前我們先補充些基礎(chǔ)內(nèi)容,首先來看下事務(wù)的ACID和數(shù)據(jù)的總體運行流程
??數(shù)據(jù)庫整體的使用流程:
ACID流程圖?
mysql核心日志:
在MySQL數(shù)據(jù)庫中有三個非常重要的日志binlog,undolog,redolog.
mvcc概念介紹:
MVCC(Multi-Version Concurrency Control):多版本并發(fā)控制,是一種并發(fā)控制的方法,一般在數(shù)據(jù)庫管理系統(tǒng)中,實現(xiàn)對數(shù)據(jù)庫的并發(fā)訪問,在編程語言中實現(xiàn)事務(wù)內(nèi)存。 MVCC 在 MySQL InnoDB 中的實現(xiàn)主要是為了提高數(shù)據(jù)庫并發(fā)性能,用更好的方式去處理讀-寫沖突,做到即使有讀寫沖突時,也能做到不加鎖,非阻塞并發(fā)讀。
當前讀和快照讀的概念:
當前讀(Current Read)指的是讀取數(shù)據(jù)當前最新數(shù)據(jù)。這種讀取方式需要保證其他并發(fā)事務(wù)不能修改當前記錄,因此會對讀取的記錄進行加鎖。在執(zhí)行當前讀操作時,用戶可以訪問數(shù)據(jù)庫中最新的數(shù)據(jù)狀態(tài),包括最近提交的事務(wù)所做的修改。這種讀取方式具有實時數(shù)據(jù)可見性,因為它讀取的是已提交的最新數(shù)據(jù)。加鎖的SELECT操作,或者對數(shù)據(jù)進行增刪改都會進行當前讀。
快照讀(Snapshot Read)則是指在讀取數(shù)據(jù)時,生成讀取快照,并在同一個事務(wù)中可能會一直讀取此快照的數(shù)據(jù)。快照讀讀到的數(shù)據(jù)可能不是最新的,而是歷史版本的數(shù)據(jù)。這些歷史版本的數(shù)據(jù)可以從undo log中獲取。在事務(wù)中的SELECT不加鎖的情況下,會執(zhí)行快照讀。快照讀依賴readview來實現(xiàn)。需要注意的是,快照讀的前提是隔離級別不是串行級別,因為在串行級別下的快照讀會退化成當前讀。
總的來說,當前讀和快照讀的主要區(qū)別在于它們讀取數(shù)據(jù)的方式和時間點。當前讀總是讀取最新的已提交數(shù)據(jù),而快照讀則可能讀取歷史版本的數(shù)據(jù)。這兩種讀取方式在數(shù)據(jù)庫操作中各有其應(yīng)用場景和優(yōu)勢。
他們相互之間的聯(lián)系:
- MVCC與快照讀:
- 快照讀是MVCC的一個實現(xiàn)方式。當執(zhí)行快照讀時,數(shù)據(jù)庫會提供一個數(shù)據(jù)的一致性快照,而不是當前最新的數(shù)據(jù)。這個快照是基于某個時間點的數(shù)據(jù)版本,可能不是最新的。
- 由于快照讀是基于多版本的,因此它不需要對讀取的數(shù)據(jù)加鎖,從而實現(xiàn)了非阻塞的讀取操作。
- 在MySQL的InnoDB存儲引擎中,快照讀是通過
read view
機制來實現(xiàn)的。read view
記錄了某個時間點的系統(tǒng)活躍事務(wù)列表,并根據(jù)這個列表來判斷哪些數(shù)據(jù)版本對當前事務(wù)是可見的。- MVCC與當前讀:
- 當前讀是讀取數(shù)據(jù)的最新版本,并且在讀取時會加鎖,以確保其他并發(fā)事務(wù)不能修改當前記錄。
- 在MVCC的上下文中,當前讀會讀取最新的數(shù)據(jù)版本,這個版本是與當前事務(wù)ID相關(guān)聯(lián)的。
- 當前讀通常發(fā)生在執(zhí)行
SELECT ... FOR UPDATE
、UPDATE
、DELETE
等操作時,這些操作需要確保讀取的數(shù)據(jù)在事務(wù)處理期間不會被其他事務(wù)修改。
代碼實例:
1.創(chuàng)建表
CREATE TABLE example (
id INT PRIMARY KEY,
value INT
);
INSERT INTO example (id, value) VALUES (1, 100);
INSERT INTO example (id, value) VALUES (2, 200);
事務(wù)A(當前讀):
START TRANSACTION;
SELECT * FROM example WHERE id = 1 FOR UPDATE; -- 當前讀,會加鎖
?事務(wù)B(快照讀):
START TRANSACTION;
SELECT * FROM example WHERE id = 1; -- 快照讀,不會加鎖,讀取的是事務(wù)開始時的數(shù)據(jù)版本
?事務(wù)A修改數(shù)據(jù):
UPDATE example SET value = 150 WHERE id = 1; -- 事務(wù)A修改數(shù)據(jù)
事務(wù)B修改數(shù)據(jù):
START TRANSACTION;
SELECT * FROM example WHERE id = 1 FOR UPDATE; -- 事務(wù)B的當前讀
?
好了 本篇文章就到這里 在這里我向大家推薦一個性價比很高課程:文章來源:http://www.zghlxwxcb.cn/news/detail-829713.html
https://xxetb.xetslk.com/s/2PjJ3T文章來源地址http://www.zghlxwxcb.cn/news/detail-829713.html
到了這里,關(guān)于mysql數(shù)據(jù)庫 mvcc的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!