詳解MySQL資料庫中的 全域性鎖 表級鎖 行級鎖

2021-10-05 04:25:09 字數 1713 閱讀 3693

在軟體開發中,程式在高併發的情況下,為了保證一致性或者說安全性,我們通常都會通過加鎖的方式來解決,在 mysql 資料庫中同樣有這樣的問題,一方面為了最大程度的利用資料庫的併發訪問,另一方面又需要保證每個使用者能以一致的方式讀取和修改資料,就引入了鎖機制。

全域性鎖是粒度最大的鎖,基本上也使用不上,就像我們家的大門一樣,控制這整個資料庫例項。全域性鎖就是對整個資料庫例項加鎖,讓整個資料庫處於唯讀狀態。

mysql 提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock (ftwrl),加鎖之後整個資料庫例項處於唯讀狀態,有關資料操作的命令都會被掛起阻塞,例如資料更新語句、資料定義語句、更新類事務語句等等。

所以全域性鎖一般只用於全庫備份的時候,一般只用在不支援一致性讀的儲存引擎做全庫備份時,比如 myisam 這種不支援一致性讀的儲存引擎做全庫備份時需要使用全域性鎖,像 innodb 引擎做全庫備份時不需要使用全域性鎖。

表級鎖是 mysql 最基本的鎖策略,並且是開銷最小的策略,它鎖住的不是整個資料庫例項,而是一張表。

表級鎖跟全域性鎖一樣,mysql 資料庫提供了加鎖的命令:lock tables … read/write。例如 lock tables t1 read, t2 write; 命令,則其他執行緒寫 t1、讀寫 t2 的語句都會被阻塞。同時,執行緒 a 在執行 unlock tables 之前,也只能執行讀 t1、讀寫 t2 的操作。連寫 t1 都不允許,自然也不能訪問其他表。

我們可以使用 unlock tables 主動釋放鎖,如果沒有使用的話,在客戶端斷開的時候自動釋放

表級鎖存在乙個問題,如果乙個查詢正在遍歷乙個表中的資料,而執行期間另乙個執行緒對這個表結構做變更,刪了一列,那麼查詢執行緒拿到的結果跟表結構對不上,肯定是不行的。

為了解決這個問題,mysql 5.5版本之後引入了元資料鎖(meta data lock,mdl),mdl 是資料庫自動加鎖,當對乙個表做增刪改查操作的時候,加 mdl 讀鎖;當要對錶做結構變更操作的時候,加 mdl 寫鎖

mdl 鎖有以下兩個特點:

行級鎖顧名思義就是針對資料庫表中的行記錄加鎖,行級鎖可以最大程度的支援併發處理,但是同時也帶來了最大的鎖開銷。

行級鎖比較容易理解,比如事務 a 更新了一行,而這時候事務 b 也要更新同一行,則必須等事務 a 的操作完成後才能進行更新。

行級鎖是由儲存引擎各自實現的,也並不是所有的儲存引擎都支援行級鎖,比如 myisam 引擎就不支援行級鎖,這意味著 myisam 儲存引擎要控制併發只能使用表級鎖。

innodb 引擎實現了行級鎖,innodb 儲存引擎中實現了兩種標準的行級鎖:

共享鎖是相容鎖,就是當乙個事務已經獲得了行 r 的共享鎖,其他事務可以立即獲得行 r 的共享鎖,因為讀並未改變行 r 的資料。

排他鎖是非相容鎖,如果有事務想獲取行 r 的排他鎖,若行 r 上有共享鎖或者排它鎖,則它必須等其他事務釋放行 r 的鎖。

在 innodb 儲存引擎中,預設情況下使用的是一致性的非鎖定行讀,也就是通過行多版本控制器來讀取行資料,我們可以顯示的為行加上共享鎖和排它鎖,語句如下:

以上就是 mysql 資料庫中有關鎖的分享,希望這篇文章對您的學習或者工作有所幫助,如果您覺得文章有用,還請幫忙****,謝謝。

mysql資料庫鎖 MySQL 資料庫中的那些鎖

全域性鎖全域性鎖是粒度最大的鎖,基本上也使用不上,就像我們家的大門一樣,控制著整個資料庫例項。全域性鎖就是對整個資料庫例項加鎖,讓整個資料庫處於唯讀狀態。mysql 提供了乙個加全域性讀鎖的方法,命令是 flush tables with read lock ftwrl 加鎖之後整個資料庫例項處於唯...

mysql資料庫鎖 MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...

MySql資料庫中的鎖機制

資料庫中的鎖機制是預設在內部執行的機制。使用者是了解這一機制,更好的支援後續的操作。從效率的角度考慮 1.2個事務併發訪問同一張表,2個都做查詢,沒必要互斥 2.2個事務併發訪問同一張表,1個查詢,1個更新,是否有必要互斥,看具體應用場景 例子1 共享單車站點可用車查詢 沒必要互斥 例子2 秒殺 有...