MySQL實戰之鎖

2021-10-12 19:20:39 字數 2334 閱讀 4863

來自極客時間,林曉斌(丁奇)的mysql實戰45講

全域性鎖就是對整個資料庫例項加鎖。mysql 提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock (ftwrl)

當你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞:

應用場景:整庫邏輯備份

表級鎖分為兩種,一種是表鎖,一種是元資料鎖(mdl, meta data lock)

表鎖的語法是 lock tables … read/write,可以用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。需要注意,lock tables 語法除了會限制別的執行緒的讀寫外,也限定了本執行緒接下來的操作物件。

舉個例子, 如果在某個執行緒 a 中執行 lock tables t1 read, t2 write; 這個語句,則其他執行緒寫 t1、讀寫 t2 的語句都會被阻塞。同時,執行緒 a 在執行 unlock tables 之前,也只能執行讀 t1、讀寫 t2 的操作。連寫 t1 都不允許,自然也不能訪問其他表。

在 mysql 5.5 版本中引入了 mdl,當對乙個表做增刪改查操作的時候,加 mdl 讀鎖;當要對錶做結構變更操作的時候,加 mdl 寫鎖。

mdl 會直到事務提交才釋放,在做表結構變更的時候,你一定要小心不要導致鎖住線上查詢和更新

行鎖就是針對資料表中行記錄的鎖。這很好理解,比如事務 a 更新了一行,而這時候事務 b 也要更新同一行,則必須等事務 a 的操作完成後才能進行更新。

在 innodb 事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放,而是要等到事務結束時才釋放。這個就是兩階段鎖協議

innodb行級鎖是通過鎖索引記錄實現的,如果更新的列沒建索引是會鎖住整個表的。innodb內部是全表根據主鍵索引逐行掃瞄,逐行加鎖。在事務完成後,統一釋放。

當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態,稱為死鎖

1)等待,直到超時

2)主動死鎖檢測

開啟後並不是每個事務都要進行檢測

1、如果他要加鎖訪問的行上有鎖,他才要檢測。比如一致性讀不會加鎖,就不需要做死鎖檢測;

2、並不是每次死鎖檢測都都要掃所有事務。只掃瞄在迴圈鏈上的事務。

b在等a

d在等c,

現在來了乙個e,發現e需要等d,那麼e就判斷跟d、c是否會形成死鎖,這個檢測不用管b和a

如果你能確保這個業務一定不會出現死鎖,可以臨時把死鎖檢測關閉掉。一般不建議採用

控制併發度,對應相同行的更新,在進入引擎之前排隊。這樣在innodb內部就不會有大量的死鎖檢測工作了。

將熱更新的行資料拆分成邏輯上的多行來減少鎖衝突,但是業務複雜度可能會大大提高

跟間隙鎖存在衝突關係的,是「往這個間隙中插入乙個記錄」這個操作。間隙鎖之間都不存在衝突關係。

間隙鎖是在可重複讀隔離級別下才會生效的。所以,你如果把隔離級別設定為讀提交的話,就沒有間隙鎖了。但同時,你要解決可能出現的資料和日誌不一致問題,需要把 binlog 格式設定為 row

間隙鎖,是專門用於解決幻讀這種問題的鎖,它鎖的了行與行之間的間隙,能夠阻塞新插入的操作間隙鎖的引入也帶來了一些新的問題,比如:降低併發度,可能導致死鎖。

間隙鎖和行鎖合稱 next-key lock,每個 next-key lock 是前開後閉區間。也就是說,我們的表 t 初始化以後,如果用 select * from t for update 要把整個表所有記錄鎖起來,就形成了 7 個 next-key lock,分別是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。

原則1:加鎖的基本單位是 next-key lock。next-key lock 是前開後閉區間。

原則2:查詢過程中訪問到的物件才會加鎖。

優化1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化為行鎖。

優化2:索引上的等值查詢,需向右遍歷時且最後乙個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。

優化3:索引上的範圍查詢:無論是否是唯一索引,範圍查詢都需要訪問到不滿足條件的第乙個值為止。

bug:唯一索引上的範圍查詢會訪問到不滿足條件的第乙個值為止。

Mysql實戰學習筆記四 鎖

全域性鎖 全域性鎖就是對整個資料庫例項進行加鎖。命令為flush tables with read lock。執行後整個庫處於唯讀狀態,資料增刪改語句,資料定義語句 建表,修改表結構 和更新類事務提交都會被阻塞。全域性鎖常用於myisam資料庫的備份,加上唯讀鎖之後備份。但是整個庫唯讀存在風險。使用...

鎖機制之MySQL表鎖

如何保證在被併發訪問時資料的一致性 完整性和有效性,是資料庫關注的核心問題。資料庫的鎖機制就是為了解決這個問題而出現的。鎖機制在一定程度上將對共享資源的併發訪問有序化,從而保證資料的一致完整性。鎖機制的好壞直接影響到資料的併發處理能力和效能。乙個好的鎖機制的實現是乙個資料的核心競爭力之一。我們知道在...

MySQL系列之鎖

分布式鎖 疑問?什麼是共享鎖?共享鎖 共享讀鎖,排他鎖 獨佔寫鎖 鎖機制與innodb鎖演算法 在關係型資料庫中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 myisam採用表級鎖 table level locking innodb支援行...