99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學院 頭像
蘋果6袋
6
麥子學院

  MySQL的表級別線程鎖機制

發(fā)布時間:2016-11-21 16:08  回復:0  查看:2558   最后回復:2016-11-21 16:08  
本文基于MySQL 8.0的源代碼總結(jié)了 MySQL數(shù)據(jù)庫 中表級別線程鎖的實現(xiàn)機制, 底層僅關注Linux平臺, Windows平臺的實現(xiàn)可能有差異. 雖然不涉及到某個特定的存儲引擎, 但會討論MySQL的handler(實現(xiàn)plugin的接口) API中與鎖相關的部分. 
  數(shù)據(jù)結(jié)構(gòu) 
  MySQL的鎖實現(xiàn)是基于POSIX的read-lock 鎖, 底層使用 mutex 和 conditional variable 等API實現(xiàn). 為了避免死鎖, 每個線程在訪問數(shù)據(jù)前需要調(diào)用 thr_multi_lock()一次性獲取所有相關表的鎖, 一個線程可以持有多個表的鎖. 
  為了便于理解, 需要區(qū)分一下 master lock 和 lock instance 兩個概念: * master lock 是指每個table share結(jié)構(gòu)中的 THR_LOCK 對象,也就是我們創(chuàng)建的每個表都有且僅有一個對應的 THR_LOCK 對象. * lock instance 是指每個open table handler 中的 THR_LOCK_DATA 對象, 也就是說多個線程并發(fā)訪問一個表的時候, 每個線程需要有一個 THR_LOCK_DATA 
  可以這樣簡單的類比, 如果master lock對應一個磁盤文件, 那么lock instance對應了一個打開該文件的句柄FD.
  數(shù)據(jù)結(jié)構(gòu)定義如下: 
  typedef struct st_thr_lock_info 
  { 
  my_thread_id thread_id; 
  mysql_cond_t *suspend; 
  } THR_LOCK_INFO; 
  typedef struct st_thr_lock_data { 
  THR_LOCK_INFO *owner; 
  struct st_thr_lock_data *next,**prev; 
  struct st_thr_lock *lock; 
  mysql_cond_t *cond; 
  enum thr_lock_type type; 
  void *status_param;  
  void *debug_print_param; 
  struct PSI_table *m_psi; 
  } THR_LOCK_DATA; 
  struct st_lock_list { 
  THR_LOCK_DATA *data,**last; 
  }; 
  typedef struct st_thr_lock { 
  LIST list; 
  mysql_mutex_t mutex; 
  struct st_lock_list read_wait; 
  struct st_lock_list read; 
  struct st_lock_list write_wait; 
  struct st_lock_list write; 
  ulong write_lock_count;  
  uint read_no_write_count; 
  void (*get_status)(void*, int);  
  void (*copy_status)(void*,void*); 
  void (*update_status)(void*);  
  void (*restore_status)(void*);  
  my_bool (*check_status)(void *); 
  } THR_LOCK; 
  THR_LOCK 
  THR_LOCK 是每個表的多個實例共享的結(jié)構(gòu), 是鎖管理的核心結(jié)構(gòu). 它的成員有: 
  · list 鏈接到全局鏈表 thr_lock_thread_list 中的list node, 使用 mysqladmin debug 命令可以打印出所有的lock信息. 
  · mutex 用于保護THR_LOCK對象自身的互斥量 
  · read_wait/read/write_wait/write 持有以及等待讀寫鎖的鏈表, 參見 THR_LOCK_DATA 結(jié)構(gòu)的 next / prev 成員 
  · write_lock_count 參考 max_write_lock_count 系統(tǒng)變量, 用于記錄連續(xù)滿足的寫請求數(shù), 以允許讀請求在多個寫請求期間得到滿足. 因為默認某些寫操作的優(yōu)先級高于讀, 連續(xù)的寫請求會導致讀請求餓死. 
  · read_no_write_count 記錄 TL_READ_NO_INSERT 鎖類型的數(shù)目 
  · void (*get_status)(void*, int) 等callback函數(shù),用于實現(xiàn) WRITE_CONCURRENT_INSERT 鎖 
  THR_LOCK_DATA 
  THR_LOCK_DATA 的成員: 
  · owner 指向所屬的線程信息, 條件變量用于wake up該線程 
  · next / prev 用于鏈表構(gòu)造 
  · lock 指向所屬的 THR_LOCK 對象 
  · cond 等待鎖時指向 owner->suspend , 以喚起該線程 
  · type 鎖類型, 后面詳細解釋 
  · status_param status functions 的參數(shù) 
  · debug_print_param 用于打印調(diào)試信息 
  · m_psi 用于performance schema instrumentation 
  鎖類型和優(yōu)先級 
  鎖請求的類型定義如下: 
  enum thr_lock_type { 
  TL_IGNORE=-1, 
  TL_UNLOCK,  
   
  TL_READ_DEFAULT, 
  TL_READ,  
  TL_READ_WITH_SHARED_LOCKS, 
   
  TL_READ_HIGH_PRIORITY, 
   
  TL_READ_NO_INSERT, 
   
  TL_WRITE_ALLOW_WRITE, 
   
  TL_WRITE_CONCURRENT_DEFAULT, 
   
  TL_WRITE_CONCURRENT_INSERT, 
   
  TL_WRITE_DEFAULT, 
   
  TL_WRITE_LOW_PRIORITY, 
   
  TL_WRITE, 
   
  TL_WRITE_ONLY 
  }; 
  拋開parser-only類型, 這些類型的優(yōu)先級從高到底排列如下: 
  · TL_WRITE_ALLOW_WRITE 
  · TL_WRITE_CONCURRENT_INSERT 
  · TL_WRITE_LOW_PRIORITY 
  · TL_READ 
  · TL_WRITE 
  · TL_READ_HIGH_PRIORITY 
  · TL_WRITE_ONLY 
  同一類型的鎖請求會按照FIFO(first-in-first-out)策略調(diào)度. 

文章來源:foobar
您還未登錄,請先登錄

熱門帖子

最新帖子

?