MySQL 5.6 global read lock 介紹
global read lock
Global_read_lock類實現global
read lock。它有兩個私有成員,分別在global和commit域保護global read lock。
1. m_mdl_global_shared_lock
實現方法是會在GLOBAL namespace層級獲取MDL shared鎖。我們知道,對一個object 修改時,需要獲取GLOBAL級別的MDL IX(Intension Exclusive)鎖。
由於MDL_shared 與MDL_INTENSION_EXCLUSIVE的排斥,所以就達到阻止其它DDL的目的。
2. m_mdl_blocks_commits_lock
DML_ticket型別,用於”COMMIT” namespace,阻止所有事務commit,即DML操作。
上面兩者的結合,完整實現了global read lock的意義。
通常來講,global read lock的實現也是分兩步的,首先是lock_global_read_lock(),其次是make_global_read_lock_block_commit。但是第二步是可選的,如果沒有第二步,commit事務將被允許。
Flush tables with read lock
Flush tables with read lock也是獲取global read lock的方法之一。但是flush tables with read lock在上面兩步中插入了另外一步,就是close_cached_tables()。這一步的作用是,關閉已經開啟的table。
但是這一步本來也會被堵,原因想必大家都非常清楚,那就是之前還有被操作的並持續開啟的表。
所以這裡會有一個問題:為什麼m_mdl_global_shared_lock()和m_mdl_blocks_commits_lock()不能合到一起,作為第一步,然後再close_cached_tables()?
原因很簡單,這樣會導致死鎖。假設這樣一個場景:
執行緒T1: select * from tab1 for update
執行緒T2: update tab1 set b=3 #此時被row-level lock堵住
執行緒T3: flush tables with read lock #被執行緒T2堵住,因為需要關閉表
接下來T1 commit事務,這將被T3堵住。T1堵住T2,T2堵住T3,T3堵住T1。
由此,死鎖產生。所以read lock和commit lock分開到第1和第3步實現才是安全的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1447289/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL5.7 Waiting for global read lockMySqlAI
- MySQL5.6新特性之Multi-Range ReadMySql
- Python GIL(Global Interpreter Lock)Python
- mysql snapshot read快照讀及current read當前讀與鎖lock之一MySql
- [譯] 谷歌:Wake Lock API 介紹谷歌API
- mysql關於FLUSH TABLES和FLUSH TABLES WITH READ LOCK的理解MySql
- MySql介紹MySql
- MySQL 8.0 Reference Manual(讀書筆記66節--locking read 與lock)MySql筆記
- Unity3D 5.6 剛體的介紹,---rigidbodyUnity3D
- MySQL Binlog 介紹MySql
- MySQL MVCC介紹MySqlMVC
- mysql MVCC 介紹MySqlMVC
- MySQL索引介紹MySql索引
- MySQL group replication介紹MySql
- MySQL 安裝介紹MySql
- MySQL檢視介紹MySql
- MySQL 官方工具utilities介紹MySql
- MySQL 8.0 目錄介紹MySql
- MySQL MRR和ICP介紹MySql
- MySQL 8.0 新增特性介紹MySql
- MySQL觸發器介紹MySql觸發器
- MySql主從同步介紹MySql主從同步
- MySQL角色(role)功能介紹MySql
- MySQL 教程基礎介紹MySql
- mysql lock操作MySql
- MySQL的repeatable readMySql
- MySQL資料庫鎖介紹MySql資料庫
- MySQL 延遲從庫介紹MySql
- mysql中SQL的概念介紹MySql
- MySQL審計外掛介紹MySql
- MySQL:5.6 升級 5.7MySql
- CentOS 安裝 mysql 5.6CentOSMySql
- Windows 安裝 MySQL 5.6WindowsMySql
- MySQL:理解MDL LockMySql
- mysql innodb lock鎖之record lock之一MySql
- Linux核心同步機制之(五):Read Write spin lock【轉】Linux
- 【MySQL】二、Innodb 恢復工具介紹MySql
- MySQL版本發展歷史介紹MySql
- MySQL Undo Log和Redo Log介紹MySql