MySQL的鎖機制及排查鎖問題解析
更新時間:2025年01月03日 14:19:36 作者:快樂江小魚
MySQL的鎖機制包括行鎖和表鎖,行鎖進一步細分為RecordLock、GapLock和Next-keyLock,行鎖因其細粒度而減少沖突但開銷大,可能引起死鎖,本文介紹MySQL的鎖機制及排查鎖問題,感興趣的朋友一起看看吧
MySQL的鎖機制及排查鎖問題
- 按照鎖的粒度可以分為行鎖和表鎖,按照是否可寫可以分為讀鎖和寫鎖。
- 行鎖是MySQL中粒度最細的鎖,對當前操作的行進行加鎖。行鎖會大大減少數據庫操作的沖突,加鎖的粒度最小,但是加鎖的開銷最大,有可能會出現死鎖。
- 行鎖的實現算法有Record Lock記錄鎖、Gap Lock間隙鎖和Next-key Lock。記錄鎖是對單行記錄加鎖,對索引項加鎖,鎖定符合條件的行,其他事務不能修改和刪除加鎖項。間隙鎖鎖定的是一個范圍,不包含記錄本身。對索引項之間的間隙加鎖,鎖定記錄的范圍,對第一條記錄前的間隙或最后一條記錄后的間隙加鎖,不包含索引項本身。其他事務不能在鎖范圍內插入數據,這樣可以防止其他事務新增幻影行。Next-key Lock是默認的鎖,同時鎖住數據和間隙鎖。鎖定索引項本身和索引范圍。
- 表鎖是MySQL中粒度最大的鎖,對當前正在操作的整張表加鎖,資源開銷比行鎖少,不會出現死鎖的情況,但是發(fā)生鎖沖突的概率比較大。InnoDB默認的是行鎖。
- 讀鎖也成為共享鎖,其他用戶可以并發(fā)讀取數據,但任何事務都不能獲取數據上的寫鎖,直到釋放所有的讀鎖。
- 寫鎖也成為排他鎖,如果事務T對數據對象A加上寫鎖,就只允許事務T讀取和修改數據對象A。
排查鎖的問題
- 排查鎖的問題可以從表鎖和行鎖考慮。
- 查看表鎖的情況后分析。
-- 查看所有線程 show full processlist; -- 查看正在使用的表 show open tables; -- 查看innodb服務器信息 show engine innodb status; -- 查看表鎖:Table_locks_waited-出現表鎖爭用而發(fā)生的等待次數,Table_locks_immediate-可以立即獲取鎖的次數 show status like 'table%';
查看行鎖的情況
-- Innodb_row_lock_current_waits:當前正在等待鎖定的數量 -- Innodb_row_lock_time:從系統(tǒng)啟動到現在鎖定的總時間 -- Innodb_row_lock_time_avg:每次等待所花的平均時間 -- Innodb_row_lock_time_max:從系統(tǒng)啟動到現在等待最長的一次所花的時間 -- Innodb_row_lock_waites:從系統(tǒng)啟動到現在總共等待的次數 show status like 'innodb_row_lock%'; -- 查看information_schema庫 -- innodb_trx表用來顯示當前運行innodb事務情況,不能判斷鎖的情況 -- innodb_locks表可以查看鎖的情況 -- innodb_lock_waits表可以查看鎖等待的情況
到此這篇關于MySQL的鎖機制及排查鎖問題的文章就介紹到這了,更多相關mysql鎖機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql中key 、primary key 、unique key 與index區(qū)別
這篇文章主要介紹了mysql中key 、primary key 、unique key 與index區(qū)別的相關資料,需要的朋友可以參考下2016-10-10一文詳解MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Co
MVCC是一種用于數據庫管理系統(tǒng)的并發(fā)控制技術,允許多個事務同時訪問數據庫,而不會導致讀寫沖突,本文就詳細的介紹了MVCC的具體用法,具有一定的參考價值,感興趣的可以了解一下2023-10-1064位CentOs7源碼安裝mysql-5.6.35過程分享
本文給大家分享的是在64位CentOs7系統(tǒng)中使用源碼安裝mysql-5.6.35的詳細過程,非常的細致,有需要的小伙伴可以參考下2017-02-02