mysql 5.7.25 ubuntu 16.04
全域性鎖即對整個資料庫例項加鎖,使得整個庫處於唯讀狀態,會阻塞dml和ddl語句。
使用如下命令(簡稱ftwrl)可為資料庫加全域性鎖:
flush tables with read lock;
釋放全域性鎖命令如下:
unlock tables;
此外,在客戶端異常斷開後,全域性鎖會自動釋放。
表鎖用於用於為單個表加鎖,表鎖的型別分為讀鎖和寫鎖。
lock tables tb_name read/write;
unlock tables;
元資料鎖(meta data lock 簡稱mdl) 用於確保事務執行過程中表結構的穩定。mdl在mysql 5.5中加入。mdl會在訪問乙個表時自動被加上。mdl分為寫鎖和讀鎖。
對乙個表執行dml語句時,會加上mdl讀鎖。mdl讀鎖之間不互斥。
對乙個表執行ddl語句時,會加上mdl寫鎖。mdl寫鎖和mdl讀鎖之間、mdl寫鎖之間互斥。例如,如果有兩個執行緒要同時給乙個表加字段,其中乙個要等另乙個執行完方可執行。
故名思議,行鎖即對行資料行進行加鎖。行鎖在引擎層由n各個資料庫引進行擎獨自實現。因此,如myisam沒有行鎖,innodb則有行鎖。
兩階段鎖協議能提高資料庫的事務處理效率。結合mvcc(多版本併發控制),能提高資料庫的併發效能。但兩階段協議也形成了造成死鎖的可能性,也為資料庫帶來為解決死鎖問題而產生的額外效能開銷甚至是資料庫崩潰。
以下說明基於mysql的innodb引擎。
併發控制主要有兩種方式:鎖和多版本併發控制(mvcc)。
為事務所需涉及的表加上鎖(為只需獲資料的共享鎖,為增刪改資料的表加上排他鎖),確保事務序列化,確保資料的正確性。但這影響了資料庫的併發效能。
mvcc為資料庫的併發效能提供了高效的解決方案。
innodb的mvcc的實現方式為為每乙個事務賦予乙個自增且唯一的transaction id。同時為涉及到事務增刪改的資料行形成乙個新版本,同時賦這個新版本乙個row trx_id,row trx_id的值和對應事務的transaction id值相同。
在事務開始執行的時候,資料庫會對整個庫建立乙個檢視,對於在檢視建時未提交的行數版本,該檢視不可見。
注意,對於已經建立但未提交的資料版本,視會通過row trx_id以及undo log回滾資料行之前已提交的版本。
兩階段鎖協議指的是事務的執行分為兩個階段,分別為擴充套件階段(此階段只能建立鎖而不能釋放鎖,即需要加鎖的時候才加鎖)以及收階段只能釋而不加鎖)。
兩階段協保證了多個事務在併發的情況下等同於序列的執行,即事務的隔離性。
當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態,稱為死鎖。
(1)超時
直接進入等待,直到超時。這個超時時間可以通過引數innodb_lock_wait_timeout 來設定。
(2)死鎖主動檢查
發起死鎖檢測,發現死鎖後,主動回滾死鎖鏈條中的某乙個事務,讓其他事務得以繼續執行。將引數 innodb_deadlock_detect 設定為on,表示開啟死鎖檢測。
注意,死鎖檢查會消耗額外資源,若併發的線過多,則有可能由死鎖檢測而消耗過多資源而導資料庫崩潰。
全域性鎖 表鎖和行鎖
全域性鎖就是對整個資料庫例項加鎖,mysql提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock。讓你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 a 資料更新語句 b 資料定義語句 c 更新類事務的提交語句 mysql裡面...
mysql筆記系列 五 全域性鎖,表鎖,行鎖
資料庫的鎖 分為 全域性鎖,表級鎖,行鎖 1.1 全域性鎖 就是給整個資料庫加鎖,mysql提供了乙個命令為 flush tables with read lock 使用後 整個庫都將處於唯讀狀態 其他執行緒的 資料更新操作 增刪改 資料定義語句 建表,修改表結構 和更新類事務的提交語句 都阻塞。全...
mysql 4 1 全域性鎖 表鎖 行級鎖
描述 兩階段鎖協議 行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放,而是要等到事務結束時才釋放 行鎖針對資料表中行記錄的鎖 死鎖當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態 根據加鎖的範圍,mysql 裡面的鎖大致...