詳細了解 MySQL鎖機制
詳細了解 MySQL的數據鎖機制:
1.MySQL中并發和隔離控制機制
Meta-data元數據鎖:在table cache緩存里實現的,為DDL(Data Definition Language)提供隔離操作。一種特別的meta-data元數據類型,叫Name Lock。(SQL層)
表級table-level數據鎖(SQL層)
存儲引擎特有機制 -- row locks行鎖,page locks頁鎖,table locks表級,versioning版本(在引擎中實現)
全局讀鎖 -- FLUSH TABLES WITH READ LOCK(SQL層)
2.在語句執行中表的生命周期
DML(Data Manipulation Language)例子:
計算語句使用到的所有表
在每個表:打開open表 -- 從table cache緩存里得到TABLE對象,并在此表加上meta-data元數據鎖
等待全局讀鎖后改變數據
在每個表:鎖lock表 -- 在表加上table-level數據鎖
執行語句:調用:handler::write_row()/read_rnd()/read_index(),等;隱式地調用引擎級engine-level鎖機制
在每個表:釋放表的數據鎖
在每個表:釋放表的DDL鎖并把表放回table cache緩存里
DDL語句也是一樣,沒有典型的執行計劃。
3.獲取meta-data元數據鎖
meta-data元數據鎖的實現作為TABLE對象的一個屬性,TABLE對象代表了table cache緩存。
meta-data元數據鎖為如下任何一種:shared共享鎖 -- 隱式地加鎖,只通過標記TABLE對象“被使用”;semi-exclusive半獨享鎖,也叫Name Lock,RENAME操作會在源表和目標加上此鎖;exclusive獨享,也叫exclusive name lock,CREATE TABLE ... SELECT操作會在目標表上加上此鎖,如果沒有的話。
4.表高速緩存(table cache)
是一個HASH變量,叫open_cache
TABLE對象是HASH元素
以HASH的操作被LOCK_open mutex互斥量保護
內部結構(The table cache: internal structure)
在緩存里,每個物理表可能被多個TABLE實例表示
相同表的所有TABLE實例,通過相連的列(a linked list)連接著
每個TABLE實例有一個table cache緩存版本的復制 -- TABLE實例保存的版本不會和當前table cache緩存版本一致,而是保存舊的和從緩存刪除的
被某些語句使用的TABLE實例被會標記為對其它的語句來說是無效的 -- 這就是meta-data元數據鎖的本質
在緩存中的TABLE實例通常地有一個有效的句柄實例連接著它
內部運算(The table cache: operations)
主要的代碼在:sql/sql_base.cc,sql/lock.cc,sql/table.h,sql/sql_table.cc
主要的方法:open_table(),close_thread_tables(),close_cached_table(),lock_table_names()
事實上,一個概念/對象組合不僅用于緩存或鎖定:LOCK_open mutex互斥量也用到其它的操作,如:使磁盤上和處理中的表創建的原子性
典型的操作,來自隔離等級Pov的重要(注:isolation PoV沒研究出是什么意思):語句查詢時,打開和關閉表 -- shared共享鎖;強制和等待直到表的所有實例被關閉 -- exclusive獨享(但不完全);Name Lock -- 特殊地情況,當手上沒有TABLE實例,只能使用一個特殊的占位符(甚至表可能不存在)。
關鍵字:MySQL、數據
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解