精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL源碼學習:MDL字典鎖

數據庫 MySQL
MDL,Meta Data lock,元數據鎖,一般稱為字典鎖。字典鎖與數據鎖相對應。字典鎖是為了保護數據對象被改變,一般是一些DDL會對字典對象改變,如兩個TX,TX1先查詢表,然后TX2試圖DROP,字典鎖就會lock住TX2,知道TX1結束(提交或回滾)。

什么是MDL

MDL,Meta Data lock,元數據鎖,一般稱為字典鎖。字典鎖與數據鎖相對應。字典鎖是為了保護數據對象被改變,一般是一些DDL會對字典對象改變,如兩個TX,TX1先查詢表,然后TX2試圖DROP,字典鎖就會lock住TX2,知道TX1結束(提交或回滾)。數據鎖是保護表中的數據,如兩個TX同時更新一行時,先得到row lock的TX會先執行,后者只能等待。

MDL的設計目標

字典鎖在設計的時候是為了數據庫對象的元數據。到達以下3個目的。

1. 提供對并發訪問內存中字典對象緩存(table definatin cache,TDC)的保護。這是系統的內部要求。

2. 確保DML的并發性。如TX1對表T1查詢,TX2同是對表T1插入。

3. 確保一些操作的互斥性,如DML與大部分DDL(ALTER TABLE除外)的互斥性。如TX1對表T1執行插入,TX2執行DROP TABLE,這兩種操作是不允許并發的,故需要將表對象保護起來,這樣可以保證binlog邏輯的正確性。(貌似之前的版本存在字典鎖是語句級的,導致 binlog不合邏輯的bug。)

支持的鎖類型

數據庫理論中的基本鎖類型是S、X,意向鎖IS、IX是為了層次上鎖而引入的。比如要修改表中的數據,可能先對表上一個表級IX鎖,然后再對修改的數據上一個行級X鎖,這樣就可以保證其他試圖修改表定義的事物因為獲取不到表級的X鎖而等待。

MySQL中將字典鎖的類型根據不同語句的功能,進一步細分,細分的依據是對字典的操作和對數據的操作。細分的好處是能在一定程度上提高并發效率,因為如果只定義X和S兩種鎖,必然導致兼容性矩陣的局限性。MySQL不遺余力的定義了如下的鎖類型。

名稱

意義

MDL_INTENTION_EXCLUSIVE

意向排他鎖,只用于范圍上鎖

MDL_SHARED

共享鎖,用于訪問字典對象,而不訪問數據。

MDL_SHARED_HIGH_PRIO

只訪問字典對象(如DESC TABLE)

MDL_SHARED_READ

共享讀鎖,用于讀取數據(如select)

MDL_SHARED_WRITE

共享寫鎖,用于修改數據(如update)

MDL_SHARED_NO_WRITE

共享非寫鎖,允許讀取數據,阻塞其他TX修改數據(如alter table)

MDL_SHARED_NO_READ_WRITE

用于訪問字典,讀寫數據

不允許其他TX讀寫數據

MDL_EXCLUSIVE

排他鎖,可以修改字典和數據

可以看到MySQL在ALTER TABLE的時候還是允許其他事務進行讀表操作的。需要注意的是讀操作的事物需要在ALTER TABLE獲取MDL_SHARED_NO_WRITE鎖之后,否則無法并發。這種應用場景應該是對一個較大的表進行ALTER時,其他事物仍然可以讀,并發性得到了提高。

鎖的兼容性

鎖的兼容性就是我們經常看到的那些兼容性矩陣,X和S必然互斥,S和S兼容。MySQL根據鎖的類型我們也可以知道其兼容矩陣如下:

 

IX

S

SH

SR

SW

SNW

SNRW

X

IX

1

1

1

1

1

1

1

1

S

1

1

1

1

1

1

1

0

SH

1

1

1

1

1

1

1

0

SR

1

1

1

1

1

1

0

0

SW

1

1

1

1

1

0

0

0

SNW

1

1

1

1

0

0

0

0

SNRW

1

1

1

0

0

0

0

0

X

1

0

0

0

0

0

0

0

1代表兼容,0代表不兼容。你可能發現X和IX竟然兼容,沒錯,其實這里的IX已經不是傳統意義上的IX,這個IX是用在范圍鎖上,所以和X鎖不互斥。

數據結構

涉及到的和鎖相關的數據結構主要是如下幾個:

MDL_context:字典鎖上下文。包含一個事物所有的字典鎖請求。

MDL_request:字典鎖請求。包含對某個對象的某種鎖的請求。

MDL_ticket:字典鎖排隊。MDL_request就是為了獲取一個ticket。

MDL_lock:鎖資源。一個對象全局唯一。可以允許多個可以并發的事物同時獲得。

涉及到的源碼文件主要是sql/mdl.cc

鎖資源

鎖資源在系統中是共享的,即全局的,存放在static MDL_map mdl_locks;的hash鏈表中,對于數據庫中的一個對象,其hashkey必然是唯一的,對應一個鎖資源。多個事務同時對一張表操作時,申請的 lock也是同一個內存對象。獲取mdl_locks中的lock需要通過全局互斥量保護起來 mysql_mutex_lock(&m_mutex); m_mutex是MDL_map的成員。

上鎖流程

一個會話連接在實現中對應一個THD實體,一個THD對應一個MDL_CONTEXT,表示需要的mdl鎖資源,一個MDL_CONTEXT中包含多個MDL_REQUEST,一個MDL_REQUEST即是對一個對象的某種類型的lock請求。每個mdl_request上有一個ticket對象,ticket中包含lock。

上鎖的也就是根據MDL_REQUEST進行上鎖。

  1. Acquire_lock:  
  2.     if (mdl_request contains the needed ticket )  
  3.     return ticket;  
  4.     End if;  
  5.     Create a ticket;  
  6.     If (!find lock in lock_sys)  
  7.     Create a lock;  
  8.     End if  
  9.     If (lock can be granted to mdl_request)  
  10.     Set lock to ticket;  
  11.     Set ticket to mdl_request;  
  12.     Else 
  13.     Wait for lock  
  14. End if 

稍微解釋下,首先是在mdl_request本身去查看有沒有相等的或者stronger的ticket,如果存在,則直接使用。否則創建一個 ticket,查找上鎖對象對應的lock,沒有則創建。檢查lock是否可以被賦給本事務,如果可以直接返回,否則等待這個lock;

鎖等待與喚醒

字典對象的鎖等待是發生在兩個事物對同一對象上不兼容的鎖導致的。當然,由于lock的唯一性,先到先得,后到的只能等待。

如何判斷一個lock是否可以grant給一個TX?這需要結合lock結構來看了,lock上有兩個成員,grant和wait,grant代表此 lock允許的事物都上了哪些鎖,wait表示等待的事務需要上哪些鎖。其判斷一個事物是否可以grant的邏輯如下:

  1. If(compatible(lock.grant, tx.locktype))  
  2.     If (compatible(lock.wait, tx.locktype))  
  3.     return can_grant;  
  4.     End if  
  5. End if 

即首先判斷grant中的鎖類型和當前事務是否兼容,然后判斷wait中的鎖類型和當前事務是否兼容。細心的話,會想到,wait中的鎖類型是不需要和當前事務進行兼容性比較的,這是不是說這個比較是多余的了?其實也不是,因為wait的兼容性矩陣和上面的矩陣是不一樣的,wait的兼容性矩陣感覺是在 DDL等待的情況下,防止DML繼續進來(wait矩陣就不寫出來了,大家可以去代碼里看下)。

比如:

TX1                    TX2                    TX3

SELECT T1

DROP  T1

SELECT T1

這時候TX2會阻塞,TX3也會阻塞,被TX2阻塞,也就是說被wait的事件阻塞了,這樣可能就是為了保證在DDL等待時,禁止再做DML了,因為在DDL面前,DML顯得確實不是那么重要了。

如何喚醒被等待的事務呢?比如喚醒TX2,當TX1結束時,會調用release_all_locks_for_name,對被鎖住的事務進行喚醒,具體操作封裝在reschedule_waiters函數中,重置等待時間的標記位進行喚醒,重點代碼如下:

  1. if (can_grant_lock(ticket->get_type(), ticket->get_ctx()))  
  2.     {  
  3.       if (! ticket->get_ctx()->m_wait.set_status(MDL_wait::GRANTED))  
  4.       {  
  5.         /*  
  6.           Satisfy the found request by updating lock structures.  
  7.           It is OK to do so even after waking up the waiter since any 
  8.           session which tries to get any information about the state of 
  9.           this lock has to acquire MDL_lock::m_rwlock first and thus,  
  10.           when manages to do so, already sees an updated state of the  
  11.           MDL_lock object.  
  12.         */  
  13.         m_waiting.remove_ticket(ticket);  
  14.         m_granted.add_ticket(ticket);  
  15.     } 

今天把mdl系統總體上看了一下,對鎖的請求、等待以及喚醒有了初步了解。并發性的問題是最難調試的,大家如果想做鎖方面的實驗,可以利用VS調試中的凍結線程的功能,這樣就可以確保并發情況控制完全按照你設計思路去呈現。

原文鏈接:http://www.cnblogs.com/nocode/archive/2011/12/15/2289507.html

責任編輯:林師授 來源: 心中無碼的博客
相關推薦

2022-03-11 09:12:06

MySQLMDL

2024-01-02 14:17:31

MySQLMDL LOCK語句

2025-05-30 02:00:00

運維腳本MDL

2022-07-20 08:06:57

MySQL表鎖Innodb

2021-02-20 06:09:46

libtask協程鎖機制

2011-08-23 13:56:12

MySQLConnection

2021-07-06 08:37:29

Redisson分布式

2021-03-26 12:07:14

JupyterPython編程語言

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2024-04-03 09:50:33

MySQLMDL事務

2022-08-12 15:41:11

神經網絡架構

2021-07-01 09:42:08

Redisson分布式

2024-11-29 07:38:12

MySQL數據庫

2015-01-20 17:09:21

Android源碼手勢鎖

2020-08-24 08:13:25

非公平鎖源碼

2021-07-08 09:21:17

ZooKeeper分布式鎖 Curator

2021-06-27 21:24:55

RedissonJava數據

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2021-12-26 18:21:28

MySQLAlter更新表
點贊
收藏

51CTO技術棧公眾號

26uuu色噜噜精品一区| 精品免费一区二区| 欧美天天综合色影久久精品| 欧美福利精品| 91国内精品久久久| 亚洲精品孕妇| www国产精品视频| 色哟哟视频在线| 国产精品毛片久久久久久久久久99999999 | 国产精品nxnn| 欧美午夜不卡视频| 91黄色在线看| 久久77777| 91在线看国产| 亚洲综合第一页| 天天爱天天做天天爽| 欧美精品一卡| 色婷婷**av毛片一区| 鲁大师私人影院在线观看| 涩涩涩久久久成人精品| 亚洲成av人片在线观看| 最新欧美日韩亚洲| 国产理论电影在线观看| 成人晚上爱看视频| 国产欧美一区二区三区久久| 国产精品100| 欧美日韩视频| 久久综合电影一区| 免费看91的网站| 日韩母乳在线| 亚洲国产精品电影| 中文字幕在线视频一区二区| 日韩一区二区三免费高清在线观看| 激情久久av一区av二区av三区| a级网站在线观看| 午夜伦理在线| 中文字幕第一区二区| 就去色蜜桃综合| 色噜噜在线播放| 国产凹凸在线观看一区二区| 91亚洲精华国产精华| 在线免费看91| 久久精品国产999大香线蕉| 国外成人性视频| 精品在线视频免费观看| 欧美日本中文| 欧美日本高清视频| 九九热只有精品| 国产精品a久久久久| 欧美大片欧美激情性色a∨久久| 四虎精品免费视频| 综合激情一区| 欧美精品久久久久久久久久| 九九免费精品视频| 国内久久精品| 91精品国产99| av大片免费观看| 久久经典综合| 国产人妖伪娘一区91| 中文在线观看av| 激情综合色综合久久综合| 成人黄色免费片| 国产白浆在线观看| 国产69精品久久777的优势| 91色中文字幕| 丰满少妇一级片| 91原创在线视频| 欧美下载看逼逼| wwwxxx在线观看| 中文字幕中文字幕一区二区| www.国产二区| 亚洲小少妇裸体bbw| 91国产丝袜在线播放| 三上悠亚av一区二区三区| 精品一区91| 亚洲第一精品福利| 丰满的亚洲女人毛茸茸| 午夜久久免费观看| 国内精品视频一区| 国产99免费视频| 国产综合久久久久久久久久久久| 99久久无色码| 毛片在线播放网址| 亚洲四区在线观看| 日本中文字幕网址| 农村妇女一区二区| 精品国产一区二区三区不卡| 亚洲激情视频小说| 中文字幕亚洲综合久久五月天色无吗'' | 亚洲综合大片69999| 亚州视频一区二区三区| 国产精品久久久久久久久久久免费看| 九九久久九九久久| 美女一区网站| 日韩一区二区三区在线视频| 国产成人无码一区二区在线观看 | 日日噜噜噜夜夜爽亚洲精品| 国产中文字幕免费| 青青草视频一区| 国产精品免费视频一区二区| 国产黄色片在线观看| 亚洲一区二区综合| 五月婷婷六月合| 中文字幕一区二区三区日韩精品| 亚洲欧美日韩一区二区在线 | 中文一区二区| 成人网在线免费看| 蜜桃视频在线观看视频| 亚洲午夜国产一区99re久久| 中文字幕亚洲乱码| 天堂一区二区三区四区| 色综合久久久888| 伊人精品在线视频| www亚洲一区| 欧日韩免费视频| 欧美午夜网站| 最近2019年手机中文字幕| 一级黄色免费网站| eeuss影院一区二区三区| 国产对白在线播放| 国产极品嫩模在线观看91精品| 亚洲国产欧美自拍| 青青操视频在线播放| 久久精品久久99精品久久| 久中文字幕一区| 欧洲一区精品| 精品国精品国产尤物美女| 黄色录像二级片| 久久精品av麻豆的观看方式| 神马影院我不卡| 日韩成人av电影| 精品一区二区三区三区| 日韩精品――中文字幕| 国产精品99久久久久久久vr| 四虎永久免费网站| 午夜精品久久久久久毛片| 一区二区三区视频观看| 无码人妻精品一区二区50| 26uuu久久天堂性欧美| 国产毛片视频网站| 欧美国产极品| 97超级碰在线看视频免费在线看 | 国内av在线播放| 国产午夜精品一区二区三区嫩草| 国产精品-区区久久久狼| 三级精品视频| 日韩暖暖在线视频| 啊v视频在线| 欧美日韩一区高清| 在线观看黄网址| 国产真实乱对白精彩久久| 这里只有精品66| 九九99久久精品在免费线bt| 欧美大胆a视频| 亚洲大尺度视频| 性欧美疯狂xxxxbbbb| free性中国hd国语露脸| 久久中文精品| 一级做a爰片久久| 中文幕av一区二区三区佐山爱| 久久精品久久精品亚洲人| 国内毛片毛片毛片毛片| 亚洲五码中文字幕| 国产精品无码专区| 三级欧美在线一区| 一区二区三区的久久的视频| 精品麻豆剧传媒av国产九九九| 欧美成人免费播放| 天堂网在线播放| 色乱码一区二区三区88| 四虎影视一区二区| 丁香婷婷综合五月| www.xxx亚洲| 亚洲欧美日韩高清在线| 国产精品视频免费观看| 亚洲精品国产嫩草在线观看| 久久久国产一区二区| 亚洲av无码乱码国产麻豆 | 亚洲一区 中文字幕| 亚洲免费看黄网站| 中文字幕在线免费看线人| 蜜臀91精品一区二区三区| 青青草综合在线| 欧美**字幕| 亚洲www在线| 澳门成人av网| 欧美精品一区二区三区国产精品| 日本免费一区视频| 欧美日韩一区二区三区在线看 | 色中色一区二区| 国产免费裸体视频| 蜜桃a∨噜噜一区二区三区| 国产精品视频999| 国产精品蜜臀| 一区二区三区美女xx视频| 不卡的日韩av| 色一情一乱一乱一91av| 午夜精品一区二区三区视频| 91啪亚洲精品| 天天操夜夜操很很操| 丝袜美腿亚洲色图| 妞干网视频在线观看| 大色综合视频网站在线播放| 国产原创精品| 精品国产一区二| 国产精品吴梦梦| 波多野结衣久久精品| 欧美高清在线观看| 老司机在线视频二区| 亚洲欧美国产视频| 亚洲男人天堂久久| 欧美丰满嫩嫩电影| 久久久久精彩视频| 欧美性xxxxxxx| 国产小视频在线看| 亚洲日本乱码在线观看| 97人妻精品一区二区免费| 成人av资源在线观看| 亚洲第一天堂久久| 蜜臀精品一区二区三区在线观看| 一女被多男玩喷潮视频| 欧美日韩伊人| 久久观看最新视频| 9999国产精品| 亚欧洲精品在线视频免费观看| 免费看久久久| 国产精品一区视频| 91精品啪在线观看国产爱臀| 91沈先生在线观看| 嫩呦国产一区二区三区av| 国产精品一久久香蕉国产线看观看| 欧美久久天堂| 欧美一级淫片videoshd| a天堂资源在线| 欧美激情视频网站| 欧美xxxx黑人又粗又长| 欧美日本啪啪无遮挡网站| 1stkiss在线漫画| 欧美老女人性生活| 国产精品偷拍| 91精品国产电影| 美女露胸视频在线观看| 538国产精品一区二区在线| 岛国av在线网站| 91成人精品网站| 成人欧美magnet| 国产999在线观看| 美女色狠狠久久| 国产日本欧美在线观看| 91麻豆精品| 91视频婷婷| 国产区精品视频在线观看豆花| 国产精品传媒毛片三区| 精品三级av在线导航| 久久久精品国产一区二区三区| 秋霞影视一区二区三区| 欧美日韩精品免费观看| 精品久久不卡| 最新av在线免费观看| 国模一区二区三区| 日韩人妻精品无码一区二区三区| 久久精品日产第一区二区| 亚洲一区二区三区四区五区xx| 久久精品国产一区二区| 永久免费黄色片| 成人av资源网站| 亚洲ⅴ国产v天堂a无码二区| 亚洲视频一区二区免费在线观看| 欧美日韩在线观看成人| 午夜亚洲福利老司机| av片免费观看| 在线播放中文字幕一区| 搡老岳熟女国产熟妇| 在线观看精品自拍私拍| 在线视频观看国产| 91av视频在线观看| 久久女人天堂| av一区二区三区四区电影| 色婷婷精品视频| 国产免费色视频| 亚洲三级影院| 中文字幕亚洲欧洲| 99久久精品免费看国产| 久久久久久久久福利| 一区二区免费在线| 国产免费a视频| 日韩精品一区国产麻豆| 成人亚洲性情网站www在线观看| 美女扒开尿口让男人操亚洲视频网站| a级片在线免费| 国产精品丝袜视频| 小嫩嫩12欧美| 狠狠噜天天噜日日噜| 丝袜国产日韩另类美女| 性高潮久久久久久| 国产清纯白嫩初高生在线观看91| 欧美爱爱免费视频| 色综合 综合色| 亚洲精品18p| 日韩中文字幕精品视频| 欧美激情网站| 国产精品推荐精品| 伊人色**天天综合婷婷| 韩国日本美国免费毛片| 粉嫩13p一区二区三区| 四虎地址8848| 色婷婷综合五月| 天天干天天爱天天操| 欧美成人h版在线观看| 国产福利91精品一区二区| 欧美精品久久| 9久re热视频在线精品| 超级砰砰砰97免费观看最新一期 | 最新日韩三级| 超碰97在线播放| 久久久久久久久久久9不雅视频| 久久9精品区-无套内射无码| 丁香桃色午夜亚洲一区二区三区| 亚洲av无一区二区三区| 欧美亚洲自拍偷拍| 欧美巨乳在线| 欧美在线激情网| 精品嫩草影院| www.99热这里只有精品| 丁香啪啪综合成人亚洲小说 | 久久精品欧洲| 加勒比精品视频| 亚洲成人激情综合网| 丰满熟妇乱又伦| 久久久久久国产精品久久| 国语精品视频| 视色,视色影院,视色影库,视色网| 久久成人免费电影| 国产在线免费看| 91麻豆精品国产91久久久| 免费网站成人| 成人午夜两性视频| 羞羞色午夜精品一区二区三区| 日本在线一二三区| 国产精品久久久久久久久免费相片 | 亚洲国产另类久久久精品极度| 久久亚洲欧美| 无码少妇精品一区二区免费动态| 色老头久久综合| 成人午夜在线观看视频| 国产精品久久久久秋霞鲁丝| 欧美精选一区二区三区| 成年人在线观看视频免费| 亚洲国产精品二十页| 亚洲一级在线播放| 免费97视频在线精品国自产拍| 久久久久亚洲精品中文字幕| 久久人妻无码一区二区| 豆国产96在线|亚洲| 日韩免费一级片| 日韩精品久久久久久福利| 欧美电影免费观看| 亚洲综合欧美日韩| 国产成人a级片| 国产做受高潮漫动| 国产一区二区激情| 亚洲国产天堂| cao在线观看| 日本一区二区三区dvd视频在线| 中文字幕欧美人妻精品| 久久国产精彩视频| 欧美日韩麻豆| 蜜臀av免费观看| 一区二区三区不卡视频在线观看| 日韩中文字幕观看| 国产精品极品美女粉嫩高清在线| 五月激情综合| 99久久久无码国产精品性波多 | 国产成人综合av| 天天综合亚洲| 免费的av网站| 欧美日韩aaaaa| 国产丝袜在线播放| 欧美一级爽aaaaa大片| 久久99精品久久久久| 日韩黄色精品视频| 在线看国产精品| 成人av婷婷| 99视频在线视频| 亚洲va欧美va人人爽| 91激情在线| 国产一区在线免费| 久久亚洲美女| 精品少妇久久久| 中文字幕国产精品| 国产精品毛片久久久| 在线观看免费视频高清游戏推荐| 亚洲一级在线观看| 成人p站proumb入口| 国产日韩精品一区观看| 久久99久久99小草精品免视看| 日韩av女优在线观看| 久久视频在线直播| 加勒比久久综合| 中文字幕 亚洲一区|