免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

mysql鎖機(jī)制詳解

:2020年05月22日 java1234
分享到:

大概幾個(gè)月之前項(xiàng)目中用到事務(wù),需要保證數(shù)據(jù)的強(qiáng)一致性,期間也用到了mysql的鎖,但當(dāng)時(shí)對(duì)mysql的鎖機(jī)制只是管中窺豹,所以本文打算總結(jié)一下mysql的鎖機(jī)制。本文主要論述關(guān)于mysql鎖機(jī)制,mysql版本為5...

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

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

概述

總的來說,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ù)時(shí)加S鎖

  • 排他鎖(eXclusive Locks,記為X鎖),修改數(shù)據(jù)時(shí)加X鎖

使用的語義為:

  • 共享鎖之間不互斥,簡(jiǎn)記為:讀讀可以并行

  • 排他鎖與任何鎖互斥,簡(jiǎn)記為:寫讀,寫寫不可以并行

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

2. 意向鎖(Intention Locks)

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

  1. 意向鎖是一個(gè)表級(jí)別的鎖(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鎖,必須先獲得表對(duì)應(yīng)的IS/IX鎖,意向鎖僅僅表明意向,意向鎖之間相互兼容,兼容互斥表如下:

ISIXIS兼 容兼 容IX兼 容兼 容

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

SXIS兼 容互 斥IX互 斥互 斥

排它鎖是很強(qiáng)的鎖,不與其他類型的鎖兼容。這其實(shí)很好理解,修改和刪除某一行的時(shí)候,必須獲得強(qiáng)鎖,禁止這一行上的其他并發(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ù)庫隔離級(jí)別為RR,表中有如下數(shù)據(jù):

10, zhangsan

20, lisi

30, wangwu

select * from t where id=1 for update;

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

4. 間隙鎖(Gap Locks)

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

select * from lock_example

where id between 8 and 15

for update;

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

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

5. 臨鍵鎖(Next-key Locks)

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

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

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

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

select * from lock_example where id = 20 for update;

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

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

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

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

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

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

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.

舉個(gè)例子(表依然是如上的例子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);

因?yàn)槭遣迦氩僮?,雖然是插入同一個(gè)區(qū)間,但是插入的記錄并不沖突,所以使用的是插入意向鎖,此處A事務(wù)并不會(huì)阻塞B事務(wù)。

7. 自增鎖(Auto-inc Locks)

自增鎖是一種特殊的表級(jí)別鎖(table-level lock),專門針對(duì)事務(wù)插入AUTO_INCREMENT類型的列。最簡(jiǎn)單的情況,如果一個(gè)事務(wù)正在往表中插入記錄,所有其他事務(wù)的插入必須等待,以便第一個(gè)事務(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.

舉個(gè)例子(表依然是如上的例子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);

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

總結(jié)

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

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

  • 共享鎖(S鎖、IS鎖),可以提高讀讀并發(fā);

  • 為了保證數(shù)據(jù)強(qiáng)一致,InnoDB使用強(qiáng)互斥鎖(X鎖、IX鎖),保證同一行記錄修改與刪除的串行性;

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

  • 表鎖:意向鎖(IS鎖、IX鎖)、自增鎖;

  • 行鎖:記錄鎖、間隙鎖、臨鍵鎖、插入意向鎖;

其中

  1. InnoDB的細(xì)粒度鎖(即行鎖),是實(shí)現(xiàn)在索引記錄上的(我的理解是如果未命中索引則會(huì)失效);

  2. 記錄鎖鎖定索引記錄;間隙鎖鎖定間隔,防止間隔中被其他事務(wù)插入;臨鍵鎖鎖定索引記錄+間隔,防止幻讀;

  3. InnoDB使用插入意向鎖,可以提高插入并發(fā);

  4. 間隙鎖(gap lock)與臨鍵鎖(next-key lock)只在RR以上的級(jí)別生效,RC下會(huì)失效;

[我要糾錯(cuò)]
[編輯:王振袢 &發(fā)表于江蘇]
關(guān)鍵詞: 大概 幾個(gè)月 前項(xiàng) 目中 用到

來源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。

點(diǎn)個(gè)贊
0
踩一腳
0

您在閱讀:mysql鎖機(jī)制詳解

Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利

蘇公網(wǎng)安備32010402000125 蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司

南京思必達(dá)教育科技有限公司版權(quán)所有   百度統(tǒng)計(jì)

主站蜘蛛池模板: 成人国产精品视频频 | 久操短视频 | 欧美日韩加勒比一区二区三区 | 欧美性受xxxx喷水性欧洲 | 视频成人永久免费视频 | 国产成人免费网站在线观看 | 欧美末成年videos丨 | 成人男女网18免费0 成人男女网18免费91 | 亚洲图片自拍偷拍 | 欧美视频网站免费看 | 亚洲视频毛片 | 天天摸天天碰天天爽天天弄 | 看片网站免费 | 亚洲国产剧情在线精品视 | 无遮挡污视频 | 色天使色婷婷丁香久久综合 | 中文在线资源链接天堂 | 国产一级特黄一级毛片 | 黄色一级片免费在线观看 | 欧美国产成人免费观看永久视频 | 欧美成人一区亚洲一区 | avtt一区| 日本三级3本三级带黄 | 手机在线黄色 | 天天操天天射天天 | 国产网站在线看 | 国产成人精品福利网站在线 | 337p欧洲亚大胆精品 | 亚洲视频中文 | 欧美成亚洲 | 簧片免费在线观看 | 欧美午夜视频一区二区三区 | 免费人成大片在线观看播放 | 男女情趣视频免费播放 | 欧美极品另类xxx | 中文字幕亚洲精品资源网 | 成在线人永久免费播放视频 | 日韩在线观看内窥镜 | 日韩欧美高清一区 | 成人一区二区免费中文字幕 | 欧美性猛交xxxx免费看手交 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產(chǎn)品享最低成本,有需要聯(lián)系,
  • 卡爾蔡司鏡片優(yōu)惠店,鏡片價(jià)格低
  • 蘋果原裝手機(jī)殼