国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql中的鎖機(jī)制深入講解

2024-07-25 19:09:16
字體:
供稿:網(wǎng)友

前言

為了保證數(shù)據(jù)的一致完整性,任何一個數(shù)據(jù)庫都存在鎖定機(jī)制。鎖定機(jī)制的優(yōu)劣直接應(yīng)想到一個數(shù)據(jù)庫系統(tǒng)的并發(fā)處理能力和性能,所以鎖定機(jī)制的實現(xiàn)也就成為了各種數(shù)據(jù)庫的核心技術(shù)之一。

大概幾個月之前項目中用到事務(wù),需要保證數(shù)據(jù)的強一致性,期間也用到了mysql的鎖,但當(dāng)時對mysql的鎖機(jī)制只是管中窺豹,所以本文打算總結(jié)一下mysql的鎖機(jī)制。

本文主要論述關(guān)于mysql鎖機(jī)制,mysql版本為5.7,引擎為innodb,由于實際中關(guān)于innodb鎖相關(guān)的知識及加鎖方式很多,所以沒有那么多精力羅列所有場景下的加鎖過程并加以分析,僅根據(jù)現(xiàn)在了解的知識,結(jié)合官方文檔,說說自己的理解,如果發(fā)現(xiàn)有不對的地方,歡迎指正。

概述

總的來說,InnoDB共有七種類型的鎖:

  • 共享/排它鎖(Shared and Exclusive Locks)
  • 意向鎖(Intention Locks)
  • 記錄鎖(Record Locks)
  • 間隙鎖(Gap Locks)
  • 臨鍵鎖(Next-key Locks)
  • 插入意向鎖(Insert Intention Locks)
  • 自增鎖(Auto-inc Locks)

mysql鎖詳解

1. 共享/排它鎖(Shared and Exclusive Locks)

  • 共享鎖(Share Locks,記為S鎖),讀取數(shù)據(jù)時加S鎖
  • 排他鎖(eXclusive Locks,記為X鎖),修改數(shù)據(jù)時加X鎖

使用的語義為:

  • 共享鎖之間不互斥,簡記為:讀讀可以并行
  • 排他鎖與任何鎖互斥,簡記為:寫讀,寫寫不可以并行

可以看到,一旦寫數(shù)據(jù)的任務(wù)沒有完成,數(shù)據(jù)是不能被其他任務(wù)讀取的,這對并發(fā)度有較大的影響。對應(yīng)到數(shù)據(jù)庫,可以理解為,寫事務(wù)沒有提交,讀相關(guān)數(shù)據(jù)的select也會被阻塞,這里的select是指加了鎖的,普通的select仍然可以讀到數(shù)據(jù)(快照讀)。

2. 意向鎖(Intention Locks)

InnoDB為了支持多粒度鎖機(jī)制(multiple granularity locking),即允許行級鎖與表級鎖共存,而引入了意向鎖(intention locks)。意向鎖是指,未來的某個時刻,事務(wù)可能要加共享/排它鎖了,先提前聲明一個意向。

1、意向鎖是一個表級別的鎖(table-level locking);

2、意向鎖又分為:

  • 意向共享鎖(intention shared lock, IS),它預(yù)示著,事務(wù)有意向?qū)Ρ碇械哪承┬屑庸蚕鞸鎖;
  • 意向排它鎖(intention exclusive lock, IX),它預(yù)示著,事務(wù)有意向?qū)Ρ碇械哪承┬屑优潘黊鎖;

加鎖的語法為:

select ... lock in share mode;  要設(shè)置IS鎖;select ... for update;       要設(shè)置IX鎖;

事務(wù)要獲得某些行的S/X鎖,必須先獲得表對應(yīng)的IS/IX鎖,意向鎖僅僅表明意向,意向鎖之間相互兼容,兼容互斥表如下:

 

  IS IX
IS 兼 容 兼 容
IX 兼 容 兼 容

 

雖然意向鎖之間互相兼容,但是它與共享鎖/排它鎖互斥,其兼容互斥表如下:

 

  S X
IS 兼 容 互 斥
IX 互 斥 互 斥

 

排它鎖是很強的鎖,不與其他類型的鎖兼容。這其實很好理解,修改和刪除某一行的時候,必須獲得強鎖,禁止這一行上的其他并發(fā),以保障數(shù)據(jù)的一致性。

3. 記錄鎖(Record Locks)

記錄鎖,它封鎖索引記錄,例如(其中id為pk):

create table lock_example(id smallint(10),name varchar(20),primary key id)engine=innodb;

數(shù)據(jù)庫隔離級別為RR,表中有如下數(shù)據(jù):

10, zhangsan
20, lisi
30, wangwu

select * from t where id=1 for update;

其實這里是先獲取該表的意向排他鎖(IX),再獲取這行記錄的排他鎖(我的理解是因為這里直接命中索引了),以阻止其他事務(wù)插入,更新,刪除id=1的這一行。

4. 間隙鎖(Gap Locks)

間隙鎖,它封鎖索引記錄中的間隔,或者第一條索引記錄之前的范圍,又或者最后一條索引記錄之后的范圍。依然是上面的例子,InnoDB,RR:

select * from lock_examplewhere id between 8 and 15 for update;

這個SQL語句會封鎖區(qū)間(8,15),以阻止其他事務(wù)插入id位于該區(qū)間的記錄。

間隙鎖的主要目的,就是為了防止其他事務(wù)在間隔中插入數(shù)據(jù),以導(dǎo)致“不可重復(fù)讀”。如果把事務(wù)的隔離級別降級為讀提交(Read Committed, RC),間隙鎖則會自動失效。

5. 臨鍵鎖(Next-key Locks)

臨鍵鎖,是記錄鎖與間隙鎖的組合,它的封鎖范圍,既包含索引記錄,又包含索引區(qū)間。

默認(rèn)情況下,innodb使用next-key locks來鎖定記錄。但當(dāng)查詢的索引含有唯一屬性的時候,Next-Key Lock 會進(jìn)行優(yōu)化,將其降級為Record Lock,即僅鎖住索引本身,不是范圍。

舉個例子,依然是如上的表lock_example,但是id降級為普通索引(key),也就是說即使這里聲明了要加鎖(for update),而且命中的是索引,但是因為索引在這里沒有UK約束,所以innodb會使用next-key locks,數(shù)據(jù)庫隔離級別RR:

事務(wù)A執(zhí)行如下語句,未提交:

select * from lock_example where id = 20 for update;

事務(wù)B開始,執(zhí)行如下語句,會阻塞:

insert into lock_example values('zhang',15);

如上的例子,事務(wù)A執(zhí)行查詢語句之后,默認(rèn)給id=20這條記錄加上了next-key lock,所以事務(wù)B插入10(包括)到30(不包括)之間的記錄都會阻塞。臨鍵鎖的主要目的,也是為了避免幻讀(Phantom Read)。如果把事務(wù)的隔離級別降級為RC,臨鍵鎖則也會失效。

6. 插入意向鎖(Insert Intention Locks)

對已有數(shù)據(jù)行的修改與刪除,必須加強互斥鎖(X鎖),那么對于數(shù)據(jù)的插入,是否還需要加這么強的鎖,來實施互斥呢?插入意向鎖,孕育而生。

插入意向鎖,是間隙鎖(Gap Locks)的一種(所以,也是實施在索引上的),它是專門針對insert操作的。多個事務(wù),在同一個索引,同一個范圍區(qū)間插入記錄時,如果插入的位置不沖突,不會阻塞彼此。

Insert Intention Lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.

舉個例子(表依然是如上的例子lock_example,數(shù)據(jù)依然是如上),事務(wù)A先執(zhí)行,在10與20兩條記錄中插入了一行,還未提交:

insert into t values(11, xxx);

事務(wù)B后執(zhí)行,也在10與20兩條記錄中插入了一行:

insert into t values(12, ooo);

因為是插入操作,雖然是插入同一個區(qū)間,但是插入的記錄并不沖突,所以使用的是插入意向鎖,此處A事務(wù)并不會阻塞B事務(wù)。

7. 自增鎖(Auto-inc Locks)

自增鎖是一種特殊的表級別鎖(table-level lock),專門針對事務(wù)插入AUTO_INCREMENT類型的列。最簡單的情況,如果一個事務(wù)正在往表中插入記錄,所有其他事務(wù)的插入必須等待,以便第一個事務(wù)插入的行,是連續(xù)的主鍵值。

AUTO-INC lock is a special table-level lock taken by transactions inserting into tables with AUTO_INCREMENT columns. In the simplest case, if one transaction is inserting values into the table, any other transactions must wait to do their own inserts into that table, so that rows inserted by the first transaction receive consecutive primary key values.

舉個例子(表依然是如上的例子lock_example),但是id為AUTO_INCREMENT,數(shù)據(jù)庫表中數(shù)據(jù)為:

1, zhangsan
2, lisi
3, wangwu

事務(wù)A先執(zhí)行,還未提交: insert into t(name) values(xxx);

事務(wù)B后執(zhí)行: insert into t(name) values(ooo);

此時事務(wù)B插入操作會阻塞,直到事務(wù)A提交。

總結(jié)

以上總結(jié)的7種鎖,個人理解可以按兩種方式來區(qū)分:

1. 按鎖的互斥程度來劃分,可以分為共享、排他鎖;

  • 共享鎖(S鎖、IS鎖),可以提高讀讀并發(fā);
  • 為了保證數(shù)據(jù)強一致,InnoDB使用強互斥鎖(X鎖、IX鎖),保證同一行記錄修改與刪除的串行性;

2. 按鎖的粒度來劃分,可以分為:

  • 表鎖:意向鎖(IS鎖、IX鎖)、自增鎖;
  • 行鎖:記錄鎖、間隙鎖、臨鍵鎖、插入意向鎖;

其中

  • InnoDB的細(xì)粒度鎖(即行鎖),是實現(xiàn)在索引記錄上的(我的理解是如果未命中索引則會失效);  
  • 記錄鎖鎖定索引記錄;間隙鎖鎖定間隔,防止間隔中被其他事務(wù)插入;臨鍵鎖鎖定索引記錄+間隔,防止幻讀;
  • InnoDB使用插入意向鎖,可以提高插入并發(fā);
  • 間隙鎖(gap lock)與臨鍵鎖(next-key lock)只在RR以上的級別生效,RC下會失效;

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产免费黄色| 午夜视频在线免费| 国产福利片在线| 自拍av在线| 国产高清av在线| 99精品老司机免费视频| 性国产高清在线观看| 亚洲最新永久在线观看| 国产在线中文字幕| 国产精品被窝福利一区| 日本亚洲精品| 国产精品冒白浆免费视频| 香蕉视频网站在线观看| 国产农村一级特黄α**毛片| 6699久久国产精品免费| 香蕉视频网站在线观看| 91xxx在线观看| 亚洲精品手机在线| 中文字幕日本在线| а√天堂www在线а√天堂视频| 国产特级淫片免费看| 免费a级人成a大片在线观看| 精品麻豆一区二区三区| 福利视频在线看| 日本天堂影院在线视频| 国产不卡在线| 国产一级又黄| 丁香在线视频| 久久精品国产麻豆| 免费在线黄色av| 在线观看的网站你懂的| 国产羞羞视频在线观看| 成人亚洲一区二区三区| 日本福利在线| 在线播放av网站| 伊人222成人综合网| 国产丝袜在线观看视频| 国产日韩精品在线看| 国产精品一区二三区| www免费在线观看| 在线观看精品一区二区三区| 国产经典自拍视频在线观看| 中文字幕在线播放网址| 91福利在线免费| 国产免费福利| 国产素人视频在线观看| 国产在线一二三区| 激情在线视频播放| 国产免费专区| 国产娇喘精品一区二区三区图片| 国产小视频在线高清播放| 国产午夜在线| 精品一区二区三区在线观看l| 国产成a人亚洲精v品| √8天堂资源地址中文在线| 国产极品一区二区三区| 99精品老司机免费视频| 亚洲精品少妇久久久久久| 亚洲一区免费在线| 久久精品最新免费国产成人| 久久国产情侣| 91av资源在线| 99在线播放| 国产在线高清理伦片a| 国产精品186在线观看在线播放| 国产成人天天5g影院| 亚洲国产成人综合| 五月亚洲综合| 永久免费在线观看| 国产乱妇乱子| 亚洲第一区视频| 国产小视频在线| 天海翼中文字幕| 国产欧美日韩第一页| 日本国产在线| 国产成a人亚洲精v品| 在线观看精品一区二区三区| 91av久久| www.av在线视频| 99久久国产视频| 午夜av在线播放| 亚洲成人av高清| 国产精品秘入口| 九九视频精品在线| 天堂中文在线观看| 国产jizz| 国产黄色av免费看| 国产精品午夜久久久久久| 亚洲www色| 在线观看av资源网| 国产黄在线观看免费观看不卡| 亚洲欧美国产另类首页| 国产精品视频一区二区免费不卡 | 国产精品一区二区婷婷| 亚洲精品在线播放视频| ·天天天天操| 国产激情视频一区二区| 国产一级免费| 国精一区二区三区| 麻豆国产视频| 久久久久国产精品嫩草影院| www网站在线观看| 日韩中文字幕久久久经典网| 2019中文字幕视频| 国产xxxxx| 一本大道久久a久久精品| 精品推荐蜜桃传媒| 国产成人精品18| 中文在线观看视频| 亚洲www色| 激情小说 在线视频| 久久精品免视着国产成人| 欧美日韩性视频一区二区三区| 日本成a人片在线观看| 超碰在线97国产| 国产网友自拍电影在线| 国产高清视频免费最新在线| 精品国产一区二区三区久久久狼牙 | 国产精品久久久久白浆| 国产黄色片在线播放| 尤物视频在线观看视频| 欧美精品另类| 国产网红在线观看| 亚洲天堂久久久| 高潮毛片在线观看| 精品卡1卡2卡三卡免费网站| 欧美日韩在线精品成人综合网| 国产美女视频一区二区三区| 最好2018中文免费视频| av亚洲在线| 国产欧美久久久久久久久| www.中文字幕久久久| 尤物视频在线观看| 在线观看免费黄色| 午夜免费视频在线国产| 亚洲久草视频| 国产色a在线| 久久这里精品| 在线视频99| 国产精品秘入口| 好吊日视频在线观看| 尤物视频在线观看视频| 国产午夜三区视频在线| xxxxx中文字幕| 精品伦理一区二区| 国产福利在线观看| 99视频资源网| 激情六月婷婷| av在线网页| av福利在线| 91亚洲精选| 国产视频三级在线观看播放| 国产自产视频| 国产在线观看色| 毛片在线视频| 青草在线视频在线观看| av资源网站在线观看| 91网页在线观看| 国产天堂在线| 午夜视频在线观看网站午夜视频在线 | www.毛片| 91亚洲欧美| 精品国内自产拍在线视频| 国产亚洲精品拍拍拍拍拍| 最新av中文字幕| 天天操人人干| 二区中文字幕| 丁香婷婷在线观看| 高清色视频在线观看| 免费日本黄色| 尤物视频网站在线观看| 国产精品偷乱一区二区三区| 91超碰免费在线| 中文字幕高清av| 国产精品入口麻豆免费看| 国产野外战在线播放| 国产福利三区| а√资源新版在线天堂| 久久综合精品视频| 国产香蕉视频在线观看| √天堂资源中文www| 亚洲91av| 国产美女在线播放| 国产精品冒白浆免费视频| 91极品在线| 青草视频在线播放| 国产一级视频| 日本免费视频www| 最近免费中文字幕在线第一页| 国产二级c片l毛片| 日本福利午夜视频在线| 国产青青草在线| 欧美高清视频| 91午夜在线| 成人精品福利| av在线电影观看| 91麻豆精品国产91久久| 免费在线黄色av| 永久av在线| 国产二级片在线|