MySQL中樂觀鎖的實現方法,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成都創新互聯公司-專業網站定制、快速模板網站建設、高性價比南縣網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南縣網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋南縣地區。費用合理售后完善,十載實體公司更值得信賴。
什么是MVCC
MVCC即Multi-Version Concurrency Control,中文翻譯過來叫多版本并發控制。
MVCC是解決了什么問題
眾所周知,在MYSQL中,MyISAM使用的是表鎖,InnoDB使用的是行鎖。而InnoDB的事務分為四個隔離級別,其中默認的隔離級別REPEATABLE READ需要兩個不同的事務相互之間不能影響,而且還能支持并發,這點悲觀鎖是達不到的,所以REPEATABLE READ采用的就是樂觀鎖,而樂觀鎖的實現采用的就是MVCC。正是因為有了MVCC,才造就了InnoDB強大的事務處理能力。
MVCC具體實現分析
InnoDB的MVCC,是通過在每行記錄后面保存兩個隱藏的列來實現的,這兩個列,分別保存了這個行的創建時間,一個保存的是行的刪除時間。這里存儲的并不是實際的時間值,而是系統版本號(可以理解為事務的ID),每開始一個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作為事務的ID.下面看一下在REPEATABLE READ隔離級別下,MVCC具體是如何操作的。
首先創建一張表:
create table yang( id int primary key auto_increment, name varchar(20) );
假設系統的版本號從1開始.
INSERT
InnoDB為新插入的每一行保存當前系統版本號作為版本號。***個事務ID為1:
start transaction; insert into yang values(NULL,'yang'); insert into yang values(NULL,'long'); insert into yang values(NULL,'fei'); commit;
對應在數據中的表如下(后面兩列是隱藏列,我們通過查詢語句并看不到)
SELECT
InnoDB會根據以下兩個條件檢查每行記錄:
InnoDB只會查找版本早于當前事務版本的數據行(也就是,行的系統版本號小于或等于事務的系統版本號),這樣可以確保事務讀取的行,要么是在事務開始前已經存在的,要么是事務自身插入或者修改過的.
行的刪除版本要么未定義,要么大于當前事務版本號(這可以確保事務讀取到的行,在事務開始之前未被刪除), 只有條件1、2同時滿足的記錄,才能返回作為查詢結果.
DELETE
InnoDB會為刪除的每一行保存當前系統的版本號(事務的ID)作為刪除標識.
看下面的具體例子分析: 第二個事務,ID為2:
start transaction; select * from yang; select * from yang; commit;
假設1:
假設在執行這個事務ID為2的過程中,剛執行到(1),這時,有另一個事務ID為3往這個表里插入了一條數據; 第三個事務ID為3;
start transaction; insert into yang values(NULL,'tian'); commit;
這時表中的數據如下:
然后接著執行事務2中的(2),由于id=4的數據的創建時間(事務ID為3),執行當前事務的ID為2,而InnoDB只會查找事務ID小于等于當前事務ID的數據行,所以id=4的數據行并不會在執行事務2中的(2)被檢索出來,在事務2中的兩條select 語句檢索出來的數據如下:
假設2
假設在執行這個事務ID為2的過程中,剛執行到(1),假設事務執行完事務3后,接著又執行了事務4;
第四個事務:
start transaction; delete from yang where id=1; commit;
此時數據庫中的表如下:
接著執行事務ID為2的事務(2),根據SELECT 檢索條件可以知道,它會檢索創建時間(創建事務的ID)小于當前事務ID的行和刪除時間(刪除事務的ID)大于當前事務的行,而id=4的行上面已經說過,而id=1的行由于刪除時間(刪除事務的ID)大于當前事務的ID,所以事務2的(2)select * from yang也會把id=1的數據檢索出來.所以,事務2中的兩條select 語句檢索出來的數據都如下:
UPDATE
InnoDB執行UPDATE,實際上是新插入了一行記錄,并保存其創建時間為當前事務的ID,同時保存當前事務ID到要UPDATE的行的刪除時間。
假設3:
假設在執行完事務2的(1)后又執行,其它用戶執行了事務3,4,這時,又有一個用戶對這張表執行了UPDATE操作:
第5個事務:
start transaction; update yang set name='Long' where id=2; commit;
根據update的更新原則:會生成新的一行,并在原來要修改的列的刪除時間列上添加本事務ID,得到表如下:
繼續執行事務2的(2),根據select 語句的檢索條件,得到下表:
還是和事務2中(1)select 得到相同的結果.
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。
網站題目:MYSQL中樂觀鎖的實現方法
本文來源:http://vcdvsql.cn/article38/pcdhpp.html
成都網站建設公司_創新互聯,為您提供App設計、面包屑導航、外貿網站建設、網站排名、微信小程序、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯