成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

理清MySQL的行鎖、意向鎖、記錄鎖、間隙鎖和臨鍵鎖

數據庫 MySQL
在InnoDB存儲引擎中行級鎖每次操作鎖住對應的行數據,鎖定粒度最小,發生鎖沖突的概率最低,并發度最高。InnoDB的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對記錄加的鎖。

在日常開發工作中,Mysql是常用的數據庫之一,突然某天Mysql數據庫告警提示出現了死鎖問題,為了解決死鎖問題,我們就需要掌握一些關于Mysql的鎖的知識。

1、行鎖

    在InnoDB存儲引擎中行級鎖每次操作鎖住對應的行數據,鎖定粒度最小,發生鎖沖突的概率最低,并發度最高。InnoDB的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對記錄加的鎖。在InnoDB存儲引擎下實現了共享鎖和排他鎖這兩種行鎖,以下是兩種鎖的介紹:

(1)共享鎖(簡稱:S)

    允許一個事務去讀一行,阻止其他事務獲得相同數據集的排它鎖。(加了共享鎖之后可以讀取,但是不可以寫) ,典型是在查詢后面添加for share。在Mysql的performance_schema下的data_locks表中記錄關于鎖的相關信息,記錄鎖信息的表位置所示的:

圖片圖片

執行如下的sql語句:

BEGIN;


#共享鎖
SELECT * from stock where id = 8 FOR SHARE;

查詢data_locks表的鎖信息:

圖片圖片

S,REC_NOT_GAP:表示對id=8的數據添加一把讀鎖(S),其中REC_NOT_GAP表示鎖的一個范圍(是指到底去鎖哪些數據),這里表示只鎖住id=8的數據。

(2)排他鎖(簡稱:X)

    允許獲取排他鎖的事務更新數據,阻止其他事務獲得相同數據集的共享鎖和排他鎖。(加了寫鎖之后其他的事務不可以添加任何的鎖【讀鎖、寫鎖都不可以】)默認每次insert、update、delete的時候都是加排他鎖,如下的更新sql:

BEGIN;
#排他鎖
update stock set num= 81 where id = 8;

查詢data_locks表的鎖信息:

圖片圖片

X,REC_NOT_GAP:表示對id=8的數據添加一把排他鎖(X),同樣的REC_NOT_GAP表示鎖的一個范圍。

    如果對select查詢添加for update的時候,此時就是排他鎖,如下的sql:

BEGIN;
#排他鎖
SELECT * from stock where id = 8 FOR UPDATE;

查詢data_locks表的鎖信息:

圖片圖片

排他鎖和共享鎖的兼容性如下鎖整理:

圖片圖片

    在案例中我們使用的是主鍵id做為where的查詢條件,假設我們現在不使用id而是使用一個非索引字段作作為查詢的條件,sql如下所示:

BEGIN;
#共享鎖
SELECT * from stock where name = 'A' FOR SHARE;

數據表中的現存的記錄如下所示:

圖片圖片

執行sql后查詢data_locks表的鎖信息:

圖片圖片

我們可以發現目前鎖類型就是表鎖了。

2、記錄鎖

    鎖一條真實存在的記錄(數據庫中真實存在的數據),如下圖是數據表中的數據記錄:

圖片圖片

通過sql查詢id=8的記錄,sql如下所示:

BEGIN;
#共享鎖
SELECT * from stock where id = 8 FOR SHARE;

鎖的結果:

圖片圖片

3、間隙鎖

    間隙是指索引跟索引之間的間隙,假設現在查詢id=5的數據(數據庫中id為5的數據不存在),如下的數據表數據:

圖片圖片

執行如下的sql:

BEGIN;
#共享鎖
SELECT * from stock where id = 5 FOR SHARE;

查詢data_locks表的鎖信息:

圖片圖片

    S表示的讀鎖,GAP表示的間隙的意思,8代表的是一個節點(真實的記錄),這里的含義是1-8之間的間隙是鎖住的,這個間隙之內不可以添加數據,但是可以修改數據。

4、臨鍵鎖

    臨鍵鎖是記錄鎖+間隙鎖,因為在去加鎖來鎖數據的時候,那么可能既包含了區間也包含了一條真實的數據,假設數據表中的數據如下所示:

圖片圖片

現在執行sql:

BEGIN;
#共享鎖
SELECT * from stock where id > 5 and id < 14 FOR SHARE;

查詢data_locks表的鎖信息:

圖片圖片

    id=8這條數據的LOCK_MODE=S,它沒有任何的標記,那么id=8這條數據就是臨鍵鎖(臨鍵鎖只標記了是X還是S);它表示既鎖死了id=8這條數據,也鎖死了id在1-8這個區間。

    id=14這條數據中,它沒有鎖死id=14這個數據,只鎖死了一個gap的區間。

5、意向鎖

    意向鎖是為了提高粗粒度鎖的性能而設置的一種預判機制(意向鎖是為了協調行鎖和表鎖的關系,用于優化InnoDB加鎖的策略),意向鎖的主要作用是避免為了判斷表是否存在行鎖而去全表掃描(即在一個操作發起實際資源的鎖申請行為之前,先對更粗力度的資源發起一個加鎖意向聲明),意向鎖是由InnoDB在操作數據之前自動加的,不需要用戶干預。如下所示的意向鎖:

圖片圖片

    意向鎖分為意向共享鎖(IS鎖)【事務在請求S鎖前,要先獲得IS鎖】;意向排他鎖(IX鎖)【事務在請求X鎖前,要先獲得IX鎖】

意向鎖(IS/IX)和X鎖是沖突的,如下所示事務A執行語句:

BEGIN;
#共享鎖
SELECT * from stock where id = 8 FOR SHARE;

事務B的執行語句:

BEGIN;
#排他鎖
update stock set num= 140 where id = 14;

執行的效果圖如下所示:

圖片圖片

①事務A首先申請整個表的IS鎖(成功)。

圖片圖片

②事務A申請id=8這一行的S鎖(成功)。

圖片圖片

③事務B申請整個表的IX鎖(成功);因為IS和IX鎖是兼容的,并且IX鎖和行級別的S鎖也是兼容的。

圖片圖片

④事務B申請整個表的X鎖(成功);

圖片圖片

所以整個過程的數據庫鎖的信息:

圖片圖片

    如果現在事務A給行記錄id=8加共享鎖成功后,事務B給id=8的行記錄加排他鎖,此時事務B就需要等待事務A釋放鎖才能加鎖成功,如下圖所示:

圖片圖片

數據庫的鎖信息如下所示:

圖片圖片

可以發現事務B此時在等待鎖。

意向鎖與其他鎖的兼容性如下表整理:

圖片圖片

    意向鎖是一種高效的鎖機制,特別適用于支持行級鎖的數據庫系統,能夠在多事務并發訪問的環境下有效地管理鎖,提高系統的并發性和數據一致性。

責任編輯:武曉燕 來源: 龍蝦編程
相關推薦

2024-05-15 09:23:45

MySQL排他鎖共享鎖

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2020-10-20 13:50:47

MySQL數據庫

2022-04-21 10:39:29

InnoDB意向鎖SQL

2023-07-03 08:15:46

MySQLInnoDB

2023-12-06 07:33:20

MySQL鎖事間隙鎖

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2022-10-24 08:02:14

MySQL索引類型

2024-11-29 07:38:12

MySQL數據庫

2018-07-31 10:10:06

MySQLInnoDB死鎖

2021-12-14 08:10:00

MySQL行鎖間隙鎖

2010-05-24 12:50:59

MySQL表級鎖

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2022-11-28 14:27:17

插入意向鎖age

2025-02-10 09:58:48

2024-10-30 10:38:08

2023-12-28 17:33:25

意向鎖MySQL開發者

2022-10-24 00:33:59

MySQL全局鎖行級鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩三级一区 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 日韩欧美一级 | 玖玖操| 欧美日韩在线观看一区二区三区 | 性福视频在线观看 | 久久精品电影 | 亚洲狠狠丁香婷婷综合久久久 | 成人免费一区二区 | 成人福利视频 | 国产精品呻吟久久av凹凸 | 国产精品婷婷 | 亚洲一区二区三区在线播放 | 国产精品一区二区欧美 | 日韩一区二区三区在线 | 免费一二区 | 亚洲国产网址 | 色99视频 | 中文字幕二区 | 超碰97人人人人人蜜桃 | 久草综合在线视频 | 中文字幕爱爱视频 | 久久99久久久久 | 免费性视频 | 九九久久精品视频 | 国产精品99久久久久久动医院 | av中文字幕在线观看 | 中文字幕欧美在线观看 | 欧美电影一区 | 亚洲网站在线播放 | 凹凸日日摸日日碰夜夜 | 午夜精品久久 | 久久久av中文字幕 | 在线国产一区二区 | 黄色一级片视频 | 雨宫琴音一区二区在线 | 精品国产伦一区二区三区观看体验 | 中文一区二区 | 人碰人操| www.9191 | 欧美精品一区三区 |