亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Mysql技術內幕之InnoDB鎖的深入講解

Mysql技術內幕之InnoDB鎖的深入講解

熱門標簽:400電話鄭州申請 地圖標注被騙三百怎么辦 北京人工外呼系統價錢 福州呼叫中心外呼系統哪家好 云南語音外呼系統平臺 沃克斯電梯外呼線路圖 房產智能外呼系統品牌 常州電銷外呼系統一般多少錢 天智外呼系統

前言

自7月份換工作以來,期間一直在學習MySQL的相關知識,聽了一些視頻課,但是一直好奇那些講師的知識是從哪里學習的。于是想著從書籍中找答案。畢竟一直

看視頻也不是辦法,不能形成自己的知識。于是想著看書汲取知識,看了幾本MySQL的相關書籍,包括《深入淺出Mysql》《高性能Mysql》《Mysql技術內幕》,發現那些講

師講的內容確實都在書上有出現過,于是確信看書才是正確的汲取知識方式。本片主要記錄了Mysql的鎖機制的學習。

1.什么是鎖

鎖是計算機協調多個進程或線程并發訪問某一資源的機制。在數據庫中,除傳統的計算資源(如CPU、RAM、I/O等)的爭用以外,數據也是一種供許多用戶共享的資源。

如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素。

相對其他數據庫而言,MySQL 的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。比如,MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level

locking);BDB存儲引擎采用的是頁面鎖(page-levellocking),但也支持表級鎖;InnoDB存儲引擎既支持行級鎖(row-levellocking),也支持表級鎖,但默認情況下是采用行級鎖。

MySQL這3種鎖的特性可大致歸納如下。

  • 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。
  • 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。
  • 頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。

3種鎖的使用角度:

  • 表級鎖更適合于以查詢為主,只有少量按索引條件更新數據的應用,如Web應用;
  • 行級鎖則更適合于有大量按索引條件并發更新少量不同數據,同時又有并發查詢的應用,如一些在線事務處理(OLTP)系統。
  • BDB的頁面鎖已經被InnoDB取代,不做討論。

2.InnoDB存儲引擎中的鎖

2.1鎖的類型

InnoDB存儲引擎實現了如下兩種標準的行級鎖:

  • 共享鎖(S Lock),允許事務讀一行數據。
  • 排他鎖(X Lock),允許事務刪除或更新一行數據。

如果一個事務T1已經獲得了行r的共享鎖,那么另外的事務T2可以立即獲得行r的共享鎖,因為讀取沒有改變行r的數據,稱這種情況

為鎖兼容(Lock Compatible)。但若有其他的事務T3想獲得行r的排他鎖,則其必須等待事務T1、T2釋放行r的共享鎖——這種情況稱為鎖不兼容。

  X S
X 不兼容 不兼容
S 不兼容 兼容

此外,InnoDB存儲引擎支持多粒度鎖定,這種鎖定允許事務在行級上鎖和表鎖上的鎖同時存在。為了支持在不同粒度上進行加鎖操作,InnoDB存

儲引擎支持一種額外的鎖方式,稱之為意向鎖。意向鎖是將鎖定的對象分為多個層次,意向鎖意味著事務希望在更細粒度上進行加鎖。 ​ InnoDB存

儲引擎支持意向鎖設計比較簡練,其意向鎖即為表級別的鎖。設計目的主要是為了在一個事務中揭示下一行將被請求的鎖類型。其支持兩種意向鎖:

  • 意向共享鎖(IS Lock),事務想要獲得一張表中某幾行的共享鎖
  • 意向排他鎖(IX Lock),事務想要獲得一張表中某幾行的排他鎖

2.2 一致性非鎖定讀

一致性的非鎖定讀(consistant nonlocking read)是指InnoDB存儲引擎通過多版本控制(multi versioning)的方法來讀取當前執行時間數據庫中行的

數據。如果讀取的行正在執行Delete或Update操作,這時讀取操作不會因此去等待行上鎖的釋放。相反地,InnoDB存儲引擎會去讀取行的一個快照

版本。如下如所示。

上圖直觀地展現了InnoDB存儲引擎一致性的非鎖定讀。之所以稱為非鎖定讀,因為不需要等待訪問的行上X鎖的釋放。快照數據是指該行的之前版本

的數據,該實現是通過undo段來完成。而undo用來在事務中回滾數據,因此快照數據本身是沒有額外的開銷。此外,讀取快照數據是不需要上鎖的,

因為沒有事務需要對歷史的數據進行修改操作。

通過上圖可以知道,快照數據其實就是當前行數據之前的歷史版本,每行記錄可能有多個版本,一般稱這種技術為行多版本技術。由此帶來的并發控制,

稱之為多版本并發控制(Multi Version Concurrency Control, MVCC)。

在事務隔離級別READ COMMITTED和REPEATABLE READ下,InnoDB存儲引擎使用非鎖定的一致性讀。然而,對于快照數據的定義卻不相同。在READ

COMMITTED事務隔離級別下,對于快照數據,非一致性讀總是讀取被鎖定行的最新一份快照數據。而在REPEATABLE READ事務隔離級別下,對于快照

數據,非一致性讀總是讀取事務開始時的行數據版本。如下表所示示例:

時間 會話A 會話B
1 begin  
2 select * from t_user where id = 1;  
3   begin
4   update t_user set id = 10 where id = 1;
5 select * from t_user where id = 1;  
6   commit;
7 select * from t_user where id = 1;  
8 commit;  

假設原本id = 1的記錄是存在的,大家可以按上表時間順序執行對應的會話,比較及驗證2者的不同。

2.3 一致性鎖定讀

在默認配置下,在事務的隔離級別為REPEATABLE READ模式下,InnoDB存儲引擎的select操作使用一致性非鎖定讀。但是在某些情況下,用戶需要顯示地

對數據庫讀取操作進行加鎖以保證數據邏輯的一致性。而這要求數據庫支持加鎖語句,即使時對于select的只讀操作。InnoDB存儲引擎對于select語句支持兩

種一致性的鎖定讀(locking read)操作:

  • select ··· for update
  • select ··· lock in share mode

select ··· for update對讀取的行記錄加一個X鎖,其他事務不能對已鎖定的行加上任何鎖。select ··· lock in share mode對讀取的行記錄加一個S鎖,其他事務可

以向被鎖定的行加S鎖,但是如果加X鎖,則會被阻塞。

對于一致性非鎖定讀,即使讀取的行已被執行了select ··· for update,也是可以進行讀取的。此外,select ··· for update或者select ··· lock in share mode必須在

一個事務中,當事務提交了,鎖也就釋放了。因此在使用上述兩種select鎖定語句時,務必加上begin,start transaction或者set autocommit=0。

3 鎖的算法

3.1行鎖的3中算法

InnoDB存儲引擎有3種行鎖的算法,其分別是:

  • Record Lock:單個行記錄上的鎖
  • Gap Lock:間隙鎖,鎖定一個范圍,但不包含記錄本身
  • Next-Key Lock:Gap Lock + Record Lock,鎖定一個范圍,并且鎖定記錄本身

  Record Lock總是會去鎖住主鍵索引記錄,如果InnoDB存儲引擎表在建立的時候沒有設置任何一個主鍵或唯一非空索引,那么這時InnoDB存儲引擎會使用隱式的

主鍵來進行鎖定。

Next-Key Lock是結合了Gap Lock+Record Lock的一種鎖定算法,在Next-Key Lock算法下,InnoDB對于行的查詢都是采用這種鎖定算法。假如一個索引有10,11

,13和20這4個值,那么該索引可能被Next-Key Locking的區間為:

(-無窮,10] ,(10,11], (11,13], (13,20], (20,+無窮)

  采用Next-Key Lock的鎖定技術稱為Next-Key Locking。其設計的目的是為了解決幻讀問題。而利用這種鎖定技術,鎖定的不是單個值,而是一個范圍。 ​ 然而,

當查詢的索引含有唯一屬性時,InnoDB存儲引擎會對Next-Key Lock進行優化將其降級為Record Lock,即僅鎖住索引本身,而不是范圍。下面演示一個例子。

mysql> create table t (a int primary key);
Query OK, 0 rows affected (0.01 sec)
​
mysql> insert into t select 1;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
​
mysql> insert into t select 2;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
​
mysql> insert into t select 5;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0

接著按下表時間順序執行操作。

時間 會話A 會話B
begin;  
select * from t where a = 5 for update;  
  begin;
  insert into t select 4;
  commit; #成功,不需要等待
commit;  

表t共有1,2,5三個值。在上面的例子中,在會話A中首先對a=5進行X鎖定。而由于a是主鍵且唯一,因此鎖定的僅是5這個值,而不是(2,5)這個范圍,這樣在會話

B中插入值4而不會阻塞,可以立即插入并返回。即鎖定由Next-Key Lock算法降級為了Record Lock,從而提高應用的并發性。

如上,Next-Key Lock降級為Record Lock僅在查詢的列是唯一索引的情況下。若是輔助索引,則情況會完全不同。同樣,首先創建測試表z進行測試:

mysql> create table z (a int ,b int ,primary key(a), key(b));
mysql> insert into z select 1,1;
mysql> insert into z select 3,1;
mysql> insert into z select 5,3;
mysql> insert into z select 7,6;
mysql> insert into z select 10,8;

表z的列b是輔助索引,若在會話A中執行下面的SQL語句:

mysql> select * from z where b = 3 for update;

很明顯,這時SQL語句通過索引列b進行查詢,因此其使用傳統的Next-Key Locking技術加鎖,并且由于有兩個索引,其需要分別進行鎖定。對于聚集索引,其僅對列

a等于5的索引加上Record Lock。而對于輔助索引,其加上的是Next-Key Lock,鎖定的范圍是(1,3),特別需要注意的是,InnoDB存儲引擎還會對輔助索引下一個

鍵值加上gap lock,即還有一個輔助索引范圍為(3,6)的鎖。因此,若在新會話B中運行下面的SQL語句,都會被阻塞:

mysql> select * from z where a = 5 lock in share mode;
mysql> insert into z select 4,2;
mysql> insert into z select 6,5;

第一個SQL語句不能執行,因為在會話A中執行的SQL語句已經對聚集索引中列a=5的值加上X鎖,因此執行會被阻塞。第二個SQL語句,主鍵插入4,沒有問題,但是插入

的輔助索引值2在鎖定的范圍(1,3)中,因此執行同樣會被阻塞。第三個SQL語句,插入的主鍵6沒有被鎖定,5也不在范圍(1,3)之間。但插入的值5在另一個鎖定的

范圍(3,6)中,故同樣需要等待。而下面的SQL語句,不會被阻塞,可以立即執行:

mysql> insert into z select 8,6;
mysql> insert into z select 2,0;
mysql> insert into z select 6,7;

從上面的例子可以看到,Gap Lock的作用是為了阻止多個事務將記錄插入到同一個范圍內,而這會導致幻讀問題的產生。假如在上面的例子中,會話A中用戶已經鎖定了

b=3的記錄。若此時沒有Gap Lock鎖定(3,6),那么用戶可以插入索引b列為3的記錄,這會導致會話A中的用戶再次執行同樣查詢時會返回不同的記錄,即幻讀。

這里主要探究的是InnoDB存儲引擎鎖表的機制,至少自己明白了Mysql的行鎖機制,不知道讀者是否有疑問,歡迎留言。下次會記錄關于Mysql事務特性及其內部的實現機制,

包括mysql的內部架構,InnoDB buffer Pool,redo log, undo log等具體的詳解,目前只是對知識過了一遍,但還未總結。

總結

到此這篇關于Mysql技術內幕之InnoDB鎖的文章就介紹到這了,更多相關Mysql InnoDB鎖內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL InnoDB架構的相關總結
  • MySQL InnoDB ReplicaSet(副本集)簡單介紹
  • 詳解MySQL InnoDB存儲引擎的內存管理
  • MySQL Innodb關鍵特性之插入緩沖(insert buffer)
  • MySQL InnoDB 鎖的相關總結
  • 如何區分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
  • Mysql InnoDB的鎖定機制實例詳解
  • 修改MySQL數據庫引擎為InnoDB的操作
  • 簡述MySQL InnoDB存儲引擎
  • MySQL InnoDB表空間加密示例詳解
  • MySQL InnoDB 事務鎖源碼分析

標簽:黔東 珠海 拉薩 移動 徐州 沈陽 鹽城 沈陽

巨人網絡通訊聲明:本文標題《Mysql技術內幕之InnoDB鎖的深入講解》,本文關鍵詞  Mysql,技術,內幕,之,InnoDB,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Mysql技術內幕之InnoDB鎖的深入講解》相關的同類信息!
  • 本頁收集關于Mysql技術內幕之InnoDB鎖的深入講解的相關信息資訊供網民參考!
  • 推薦文章
    成人高清视频在线观看| 999精品在线| 精品国产亚洲人成在线| 国产伦理精品| 黄色福利片| 国产麻豆精品免费密入口| 一级片片| 精品视频在线观看一区二区三区| 日本在线www| 成人高清视频免费观看| 成人高清免费| 深夜做爰性大片中文| 九九免费高清在线观看视频| 一级女性全黄久久生活片| 久久99爰这里有精品国产| 亚久久伊人精品青青草原2020| 亚洲女人国产香蕉久久精品| 日日爽天天| 青青青草影院| 久久国产一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美另类videosbestsex高清| 久久国产精品永久免费网站| 精品毛片视频| 99热精品在线| 精品久久久久久综合网| 99色吧| 国产网站麻豆精品视频| 一级毛片视频在线观看| 国产视频网站在线观看| 在线观看成人网| 午夜精品国产自在现线拍| 台湾美女古装一级毛片| 成人免费观看网欧美片| 日日日夜夜操| 亚洲精品久久久中文字| 国产视频一区二区在线播放| 国产极品精频在线观看| 日韩中文字幕一区二区不卡| 久草免费资源| 九九国产| 欧美日本免费| 四虎影视库国产精品一区| 香蕉视频久久| 青青久热| 日韩在线观看免费完整版视频| 国产原创中文字幕| 国产a网| 日韩中文字幕一区| 欧美激情一区二区三区视频 | 一a一级片| 国产成人精品一区二区视频| 欧美a免费| 欧美激情一区二区三区视频| 日韩在线观看视频黄| 香蕉视频久久| 亚州视频一区二区| 国产伦久视频免费观看视频| 一本伊大人香蕉高清在线观看| 国产原创中文字幕| 国产高清在线精品一区a| 久久国产精品自线拍免费| 国产不卡福利| 国产a网| 99热热久久| 国产激情视频在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产精品自拍一区| 可以免费看污视频的网站| 日韩中文字幕一区二区不卡| 精品国产一区二区三区国产馆| 欧美激情在线精品video| 国产不卡在线观看视频| 欧美另类videosbestsex久久| 一级片免费在线观看视频| 国产不卡精品一区二区三区| 四虎影视久久久免费| 精品在线观看一区| 天天色色网| 亚洲精品影院| 久久99这里只有精品国产| 999精品在线| 久久国产一久久高清| 午夜欧美福利| 午夜欧美成人香蕉剧场| 欧美a免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产成人啪精品| 国产不卡在线看| 日日夜夜婷婷| 日韩中文字幕一区| 免费的黄色小视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品视频在线观看视频免费视频 | 成人免费网站视频ww| 国产视频一区二区在线观看| 999久久久免费精品国产牛牛| 日本伦理黄色大片在线观看网站| 国产91精品一区| 国产a网| 久久99中文字幕久久| 日韩中文字幕在线亚洲一区| 久久99爰这里有精品国产| 精品毛片视频| 日本伦理片网站| 国产网站在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产a免费观看| 国产亚洲精品成人a在线| 黄视频网站免费看| 亚欧视频在线| 九九九在线视频| 欧美一级视频免费| 99热精品在线| 天天色色网| 美女免费精品视频在线观看| 日韩免费在线视频| 精品国产一区二区三区国产馆| 日本特黄特黄aaaaa大片| 久久久久久久久综合影视网| 99久久精品国产免费| 日韩字幕在线| 91麻豆tv| 国产视频一区在线| 亚洲女初尝黑人巨高清在线观看| 久久国产影院| 欧美另类videosbestsex高清| 免费一级片网站| 久久国产精品永久免费网站| 欧美大片a一级毛片视频| 国产原创中文字幕| 精品视频一区二区| 精品在线观看一区| 一级毛片视频免费| 成人a大片在线观看| 色综合久久久久综合体桃花网| 一a一级片| 久久精品店| 成人影院一区二区三区| 日本特黄一级| 日本免费看视频| 国产欧美精品午夜在线播放| 久久国产精品自由自在| 国产一区二区高清视频| 精品视频一区二区| 精品在线观看一区| 欧美18性精品| 国产91丝袜高跟系列| 精品久久久久久影院免费| 国产精品自拍在线| 日本在线www| 一本伊大人香蕉高清在线观看| 国产一区二区精品尤物| 亚洲wwwwww| 日本特黄特黄aaaaa大片| 亚洲女初尝黑人巨高清在线观看| 欧美大片一区| 韩国毛片| 一a一级片| 亚久久伊人精品青青草原2020| 久久国产精品只做精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品国产香蕉在线播出| 欧美一级视| 久久久久久久男人的天堂| 午夜欧美成人香蕉剧场| 一级毛片视频免费| 欧美激情中文字幕一区二区| 成人免费观看男女羞羞视频| 999久久久免费精品国产牛牛| 毛片的网站| 青青久热| 日本免费看视频| 久久成人亚洲| 精品美女| 成人影院久久久久久影院| 日本伦理网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人啪精品| 久久精品成人一区二区三区| 日日日夜夜操| 中文字幕一区二区三区 精品| 国产精品自拍在线| 欧美激情一区二区三区视频| 国产原创中文字幕| 久久99中文字幕| 在线观看成人网| 亚洲www美色| 一级女性全黄生活片免费| 一级片片| 欧美a级片视频| 国产极品精频在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡在线播放| 高清一级毛片一本到免费观看| 欧美激情中文字幕一区二区| 国产高清在线精品一区a| 台湾美女古装一级毛片| 欧美国产日韩久久久| 日本特黄特色aaa大片免费|