詳細了解 MySQL鎖機制

2022-03-31 20:50:50 字數 1845 閱讀 6904

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例項,只能使用乙個特殊的佔位符(甚至表可能不存在)。

apply call詳細了解

function thisobj argarray call 方法 function call thisobj arg1 arg2.定義 call 呼叫乙個物件的乙個方法,用另乙個物件替換當前物件。例 b.call a,args1,args2 a物件應用b物件的方法 他們都是用來代替另乙個物件呼叫乙...

詳細了解 Cookie Session Token

很久很久以前,web基本上就是文件的瀏覽而已,既然是瀏覽,作為伺服器 不需要記錄誰在某一段時間裡都瀏覽了什麼文件。每次請求都是乙個新的http協議,就是請求加響應,尤其不用記住是誰則剛發了http請求,每個請求相對來說都是全新的。也就是說必須把每個人區分開,這是乙個不小的挑戰,因為http請求是無狀...

詳細了解try catch return

情況1 try中有return,finally中沒有return public class trytest private static inttest catch exception e finally system.out.println finally return num 輸出結果如下 tr...