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

2021-10-25 14:16:38 字數 1765 閱讀 5457

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

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 儲存引擎中實現了兩種標準的行級鎖:

共享鎖(s lock):允許事務讀一行

排它鎖(x lock):允許事務刪除和更新一行

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

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

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

select ..... for update:對讀取的行記錄加乙個排它鎖,其他事務想要在這些行上加任何鎖都會被阻塞

select ....... lock in share mode:對讀取的行記錄加乙個共享鎖,其他事務可以向被鎖定的記錄加共享鎖,但是想要加排它鎖。則會被阻塞。

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

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

mysql資料庫鎖

表鎖 讀鎖會阻塞寫,但是不會阻塞讀操作。而寫鎖則會把讀和寫都阻塞 myisam索引結構 myisam索引用的b tree來儲存資料,myisam索引的指標指向的是鍵值的位址,位址儲存的是資料。b tree的資料域儲存的內容為實際資料的位址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實...

MySQL資料庫鎖

mysql鎖分為表級鎖 頁級鎖和行級鎖。innodb 行級鎖 在特殊情況下會公升級為表級鎖,如給沒有加索引的非唯一字段加鎖,或者在普通索引中,使用模糊查詢使索引失效,導致加鎖時,公升級為表鎖 myisam 表級鎖 排他鎖又稱為寫鎖,乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖,也修...