日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL 鎖的相關知識總結

瀏覽:61日期:2023-10-06 12:26:29
MySQL中的鎖

鎖是為了解決并發環境下資源競爭的手段,其中樂觀并發控制,悲觀并發控制和多版本并發控制是數據庫并發控制主要采用的技術手段(具體可見我之前的文章),而MySQL中的鎖就是其中的悲觀并發控制。

MySQL中的鎖有很多種類,我們可以按照下面方式來進行分類。

按讀寫

從數據庫的讀寫的角度來分,數據庫的鎖可以分為分為以下幾種:

獨占鎖:又稱排它鎖、X鎖、寫鎖。X鎖不能和其他鎖兼容,只要有事務對數據上加了任何鎖,其他事務就不能對這些數據再放置X了,同時某個事務放置了X鎖之后,其他事務就不能再加其他任何鎖了,只有獲取排他鎖的事務是可以對數據進行讀取和修改。 共享鎖:又稱讀鎖、S鎖。S鎖與S鎖兼容,可以同時放置。 更新鎖:又稱U鎖。它允許再加S鎖,但不允許其他事務再施加U鎖或X鎖,當被讀取的數據要被更新時,則升級S鎖為X鎖。U鎖的優點是允許事務A讀取數據的同時不阻塞其它事務,并同時確保事務A自從上次讀取數據后數據沒有被更改,因此可以減少X鎖和S鎖的沖突,同時避免使用S鎖后再升級為X鎖造成的死鎖現象。注意,MySQL并不支持U鎖,SQLServer才支持U鎖。

兼容性矩陣如下(+ 代表兼容, -代表不兼容)

右側是已加的鎖 X S U X - - - S - + + U - + -

按粒度

MySQL支持不同級別的鎖,其鎖定的數據的范圍也不同,也即我們常說的鎖的粒度。MySQL有三種鎖級別:行級鎖、頁級鎖、表級鎖。不同的存儲引擎支持不同的鎖粒度,例如MyISAM和MEMORY存儲引擎采用的是表級鎖,頁級鎖僅被BDB存儲引擎支持,InnoDB存儲引擎支持行級鎖和表級鎖,默認情況下是采用行級鎖。

特點

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。數據庫引擎總是一次性同時獲取所有需要的鎖以及總是按相同的順序獲取表鎖從而避免死鎖。行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。行鎖總是逐步獲得的,因此會出現死鎖。頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。

下面詳細介紹行鎖和表鎖,頁鎖由于使用得較少就不介紹了。

行鎖

按行對數據進行加鎖。InnoDB行鎖是通過給索引上的索引項加鎖來實現的,Innodb一定存在聚簇索引,行鎖最終都會落到聚簇索引上,通過非聚簇索引查詢的時候,先鎖非聚簇索引,然后再鎖聚簇索引。如果一個where語句里面既有聚簇索引,又有二級索引,則會先鎖聚簇索引,再鎖二級索引。由于是分步加鎖的,因此可能會有死鎖發生。

MySQL的行鎖對S、X鎖上做了一些更精確的細分,使得行鎖的粒度更細小,可以減少沖突,這就是被稱為“precise mode”的兼容矩陣。(該矩陣沒有出現在官方文檔上,是有人通過Mysql lock0lock.c:lock_rec_has_to_wait源代碼推測出來的。)

行鎖兼容矩陣 間隙鎖(Gap Lock):只鎖間隙,前開后開區間(a,b),對索引的間隙加鎖,防止其他事務插入數據。 記錄鎖(Record Lock):只鎖記錄,特定幾行記錄。 臨鍵鎖(Next-Key Lock):同時鎖住記錄和間隙,前開后閉區間(a,b]。 插入意圖鎖(Insert Intention Lock):插入時使用的鎖。在代碼中,插入意圖鎖,實際上是GAP鎖上加了一個LOCK_INSERT_INTENTION的標記。

右側是已加的鎖(+ 代表兼容, -代表不兼容) G R N I G + + + + R + ? ? + N + ? ? + I ? + ? +

S鎖和S鎖是完全兼容的,因此在判別兼容性時不需要對比精確模式。精確模式的檢測,用在S、X和X、X之間。從這個矩陣可以看到幾個特點:

INSERT操作之間不會有沖突:你插入你的,我插入我的。 GAP,Next-Key會阻止Insert:插入的數據正好在區間內,不允許插入。 GAP和Record,Next-Key不會沖突 Record和Record、Next-Key之間相互沖突。 已有的Insert鎖不阻止任何準備加的鎖。 間隙鎖(無論是S還是X)只會阻塞insert操作。 注意點 對于記錄鎖,列必須是唯一索引列或者主鍵列,查詢語句必須為精確匹配,如“=”,否則記錄鎖會退化為臨鍵鎖。 間隙鎖和臨鍵鎖基于非唯一索引,在唯一索引列上不存在間隙鎖和臨鍵鎖。 表鎖與鎖表的誤區

只有正確通過索引條件檢索數據(沒有索引失效的情況),InnoDB才會使用行級鎖,否則InnoDB對表中的所有記錄加鎖,也就是將鎖住整個表。注意,這里說的是鎖住整個表,但是Innodb并不是使用表鎖來鎖住表的,而是使用了下面介紹的Next-Key Lock來鎖住整個表。網上很多的說法都是說用表鎖,然而實際上并不是,我們可以通過下面的例子來看看。

假設我們有以下的數據(MySQL8):

mysql> select * from users;+----+------+-----+| id | name | age |+----+------+-----+| 1 | a | 1 || 2 | a | 1 || 3 | a | 1 || 4 | a | 1 || 5 | a | 1 |+----+------+-----+

方法一:

我們使用表鎖鎖表,并查看引擎的狀態

mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> lock tables users write;Query OK, 0 rows affected (0.00 sec)mysql> show engine innodb statusG...------------TRANSACTIONS------------Trx id counter 4863Purge done for trx’s n:o < 4862 undo n:o < 0 state: running but idleHistory list length 911LIST OF TRANSACTIONS FOR EACH SESSION:---TRANSACTION 281479760456232, not startedmysql tables in use 1, locked 1 ###############注意這里0 lock struct(s), heap size 1136, 0 row lock(s)...

然后我們再通過非索引的字段查詢來加鎖,并查看引擎的狀態

## 先解鎖上次的表鎖mysql> unlock tables;Query OK, 0 rows affected (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from users where name = ’a’ for update;mysql> show engine innodb statusG...------------TRANSACTIONS------------Trx id counter 4864Purge done for trx’s n:o < 4862 undo n:o < 0 state: running but idleHistory list length 911LIST OF TRANSACTIONS FOR EACH SESSION:---TRANSACTION 4863, ACTIVE 37 sec2 lock struct(s), heap size 1136, 6 row lock(s) ###############注意這里...

然后我們再刪除id為2,3,4的數據,然后在通過非索引的字段查詢來加鎖,并查看引擎的狀態

mysql> delete from users where id in (2,3,4);Query OK, 3 rows affected (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from users where name = ’a’ for update;mysql> show engine innodb statusG...------------TRANSACTIONS------------Trx id counter 4870Purge done for trx’s n:o < 4869 undo n:o < 0 state: running but idleHistory list length 914LIST OF TRANSACTIONS FOR EACH SESSION:---TRANSACTION 4869, ACTIVE 9 sec2 lock struct(s), heap size 1136, 3 row lock(s) ###############注意這里...

可以看到這里使用了表鎖和因為沒法用索引鎖定特定行而轉而鎖住整個表是不一樣的。從第二次和第三次的操作來看,lock住的row也是不同的,這是因為兩者間隙的個數不同,所以可以看到使用的并不是表鎖,而是Next-Key Lock。第一次鎖住了(-∞,1],(1,2],(2,3],(3,4],(4,5],(5,∞],第二次鎖住了(-∞,1],(1,5],(5,∞]。

方法二:

也可以通過以下語句來查看鎖的信息,也可以知道用的是行鎖,且是鎖住了區間(插入不了數據)和記錄,所以是Next-Key Lock。

mysql> select ENGINE_TRANSACTION_ID,LOCK_TYPE,LOCK_MODE from performance_schema.data_locks where ENGINE_TRANSACTION_ID in (你的事務id);+-----------------------+-----------+-----------+| ENGINE_TRANSACTION_ID | LOCK_TYPE | LOCK_MODE |+-----------------------+-----------+-----------+| 4889 | TABLE | IX || 4889 | RECORD | X || 4889 | RECORD | X || 4889 | RECORD | X |+-----------------------+-----------+-----------+10 rows in set (0.00 sec)

LOCK_TYPE:對于InnoDB,可選值為 RECORD(行鎖), TABLE(表鎖)

LOCK_MODE:對于InnoDB,可選值為S[,GAP], X[,GAP], IS[,GAP],IX[,GAP], AUTO_INC和UNKNOWN。除了AUTO_INC和UNKNOWN,其他鎖定模式都包含了GAP鎖(如果存在)。

具體可見 MySQL文檔:https://dev.mysql.com/doc/ref...

表級鎖

直接對整個表加鎖,影響表中所有記錄,表讀鎖和表寫鎖的兼容性見上面的分析。

MySQL中除了表讀鎖和表寫鎖之外,還存在一種特殊的表鎖:意向鎖,這是為了解決不同粒度的鎖的兼容性判斷而存在的。

意向鎖

因為鎖的粒度不同,表鎖的范圍覆蓋了行鎖的范圍,所以表鎖和行鎖會產生沖突,例如事務A對表中某一行數據加了行鎖,然后事務B想加表鎖,正常來說是應該要沖突的。如果只有行鎖的話,要判斷是否沖突就得遍歷每一行數據了,這樣的效率實在不高,因此我們就有了意向表鎖。

意向鎖的主要目的是為了使得 行鎖 和 表鎖 共存,事務在申請行鎖前,必須先申請表的意向鎖,成功后再申請行鎖。注意:申請意向鎖的動作是數據庫完成的,不需要開發者來申請。

意向鎖是表級鎖,但是卻表示事務正在讀或寫某一行記錄,而不是整個表, 所以意向鎖之間不會產生沖突,真正的沖突在加行鎖時檢查。

意向鎖分為意向讀鎖(IS)和意向寫鎖(IX)。

表鎖的兼容性矩陣

右側是已加的鎖(+ 代表兼容, -代表不兼容) IS IX S X IS + + + ? IX + + ? ? S + ? + ? X ? ? ? ?

以上就是MySQL 鎖的相關知識總結的詳細內容,更多關于MySQL 鎖的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
手机精品视频在线观看| 蜜桃免费网站一区二区三区| 中日韩男男gay无套| 91精品婷婷色在线观看| 四虎国产精品免费观看| 精品国产精品国产偷麻豆| 日本成人在线网站| 国产欧美日韩在线一区二区| 国产欧美日韩精品高清二区综合区| 欧美日本精品| 国产精品欧美大片| 都市激情国产精品| 狠狠久久婷婷| 日本亚洲视频| 精品美女在线视频| 免费看av不卡| 天使萌一区二区三区免费观看| 亚洲久久在线| 国产欧洲在线| 久久福利精品| 中文字幕av一区二区三区人| 日韩中文字幕不卡| 国产精品igao视频网网址不卡日韩 | av中文字幕在线观看第一页| 99久久久久| 国产精品超碰| 中文国产一区| 国产一区二区三区视频在线| 国产一区日韩一区| 久久国产婷婷国产香蕉| 久久蜜桃资源一区二区老牛| 日韩一区二区三区四区五区| 三级小说欧洲区亚洲区| 日韩激情中文字幕| 日本一二区不卡| 奇米亚洲欧美| 国产精品老牛| 日韩欧美看国产| 欧美一级网址| 亚洲欧美日本日韩| 日韩一区二区三区免费播放| 日韩一区二区三免费高清在线观看| 私拍精品福利视频在线一区| 久久狠狠久久| 亚洲另类黄色| 亚洲一区二区毛片| 免费污视频在线一区| 精品无人区麻豆乱码久久久| 日韩久久99| 美女网站一区| 久久久精品日韩| 成人美女视频| 精品视频一区二区三区四区五区 | 麻豆精品av| 国产日韩欧美三区| 国产日韩亚洲| 欧美日韩xxxx| 国产精品极品国产中出| 国产欧美亚洲一区| 国产极品一区| 成人在线观看免费视频| 国产精品一区二区99| 欧美日本不卡高清| 国产欧美午夜| 国产一区二区三区亚洲| 精品久久97| 久久久噜噜噜| 丝袜亚洲精品中文字幕一区| 日韩中文字幕一区二区三区| 伊人久久大香伊蕉在人线观看热v| 玖玖精品视频| 国产剧情一区| 欧美日韩国产观看视频| 国产99久久| 丝袜亚洲另类欧美| 777久久精品| 欧美91在线|欧美| 国产精品亚洲二区| 香蕉视频亚洲一级| 亚洲一区成人| 麻豆精品久久久| 亚洲天堂1区| 日韩中文字幕不卡| 国产日本亚洲| 91精品一区二区三区综合| 黑丝美女一区二区| 国产欧美自拍| 欧美成人日韩| 亚州av日韩av| 久久青青视频| 91精品视频一区二区| 中文字幕成在线观看| 99久久夜色精品国产亚洲狼 | 国产福利亚洲| 91精品99| 久久av免费看| 老牛国产精品一区的观看方式| 国产极品一区| 亚洲欧美久久精品| 日韩在线不卡| 日韩av在线播放中文字幕| 丝袜美腿诱惑一区二区三区 | 亚洲欧美综合| 成人污污视频| 国产精品亚洲综合色区韩国| 亚洲欧美日韩一区在线观看| 国产精品99一区二区三| 日韩精品亚洲专区在线观看| 精品欧美一区二区三区在线观看| 欧美亚洲一级| 中文字幕亚洲在线观看| 九九久久电影| 久久精品在线| 亚洲午夜天堂| 色偷偷偷在线视频播放| 精品欠久久久中文字幕加勒比| 一二三区精品| 亚洲欧美日韩视频二区| 欧美91福利在线观看| 欧美一级鲁丝片| 91亚洲国产成人久久精品| 欧美黄色一区二区| 国产精品多人| 久久一区欧美| 高清久久一区| 午夜精品成人av| 91精品国产91久久久久久黑人| 国产一区二区三区精品在线观看| 国产精品白丝一区二区三区| 久久国内精品自在自线400部| 国产欧美一区二区精品久久久| 亚洲精品免费观看| 日韩av一区二区三区| 欧美一区91| 国内自拍视频一区二区三区| 国产成人免费视频网站视频社区| 国产精品日韩精品中文字幕| 久久尤物视频| 久久激情婷婷| 日韩有码av| 麻豆mv在线观看| 亚洲免费影视| 国产精品尤物| 久久精品成人| 日韩高清一区在线| 成年男女免费视频网站不卡| 桃色av一区二区| 亚洲欧美日韩国产| 欧美国产极品| 欧美精品一二| 国产精选久久| 欧美精选一区二区三区| 久久精品凹凸全集| 精品视频一二| 亚洲一区黄色| 粉嫩av一区二区三区四区五区 | 国产999精品在线观看| 国产综合亚洲精品一区二| 亚洲区国产区| 麻豆视频在线观看免费网站黄 | 欧美日本精品| 亚洲不卡av不卡一区二区| 国产一区白浆| 荡女精品导航| 日韩超碰人人爽人人做人人添| 亚洲国产福利| 亚洲综合小说| 美女网站一区| 精品在线网站观看| 日韩精品久久理论片| 99久久www免费| 精品淫伦v久久水蜜桃| 中文字幕av一区二区三区四区| 欧洲亚洲一区二区三区| 美女国产一区二区三区| 亚洲欧美一级| 蜜桃视频在线观看一区二区| 久久久国产亚洲精品| 国产成人久久精品麻豆二区| 欧美日本不卡| 国产伦精品一区二区三区视频 | 欧美专区一区二区三区| 黄色aa久久| 国产一区二区三区黄网站| 欧美日韩一区二区三区不卡视频| 黄色成人在线网址| 高清av不卡| 日韩在线观看一区| 国产a亚洲精品| 精品视频一区二区三区四区五区| 欧美日本不卡高清| 国产精品视频一区二区三区综合| 免费人成精品欧美精品| 亚洲激精日韩激精欧美精品| 老牛影视精品| 99精品在线观看| 欧美1区2区3区| 日韩中文欧美在线| 91亚洲精品在看在线观看高清| 亚洲ww精品|