MYSQL 解鎖與鎖表介紹
MySQL鎖概述
相對其他數(shù)據(jù)庫而言,MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。比如,MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level locking);BDB存儲引擎采用的是頁面鎖(page-level locking),但也支持表級鎖;InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認情況下是采用行級鎖。
MySQL這3種鎖的特性可大致歸納如下。
開銷、加鎖速度、死鎖、粒度、并發(fā)性能
l 表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
l 行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
l 頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。
MyISAM表鎖
MyISAM存儲引擎只支持表鎖,這也是MySQL開始幾個版本中唯一支持的鎖類型。隨著應用對事務完整性和并發(fā)性要求的不斷提高,MySQL才開始開發(fā)基于事務的存儲引擎,后來慢慢出現(xiàn)了支持頁鎖的BDB存儲引擎和支持行鎖的InnoDB存儲引擎(實際 InnoDB是單獨的一個公司,現(xiàn)在已經(jīng)被Oracle公司收購)。但是MyISAM的表鎖依然是使用最為廣泛的鎖類型。本節(jié)將詳細介紹MyISAM表鎖的使用。
查詢表級鎖爭用情況
可以通過檢查table_locks_waited和table_locks_immediate狀態(tài)變量來分析系統(tǒng)上的表鎖定爭奪:
mysql> show status like 'table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate | 2979 |
| Table_locks_waited | 0 |
+-----------------------+-------+
2 rows in set (0.00 sec))
如果Table_locks_waited的值比較高,則說明存在著較嚴重的表級鎖爭用情況。
獲取InnoDB行鎖爭用情況
可以通過檢查InnoDB_row_lock狀態(tài)變量來分析系統(tǒng)上的行鎖的爭奪情況:
mysql> show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| InnoDB_row_lock_current_waits | 0 |
| InnoDB_row_lock_time | 0 |
| InnoDB_row_lock_time_avg | 0 |
| InnoDB_row_lock_time_max | 0 |
| InnoDB_row_lock_waits | 0 |
+-------------------------------+-------+
5 rows in set (0.01 sec)
如果發(fā)現(xiàn)鎖爭用比較嚴重,如InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比較高,還可以通過
解鎖
第一種
show processlist;
找到鎖進程,kill id ;
第二種
mysql>UNLOCK TABLES;
鎖表
鎖定數(shù)據(jù)表,避免在備份過程中,表被更新
mysql>LOCK TABLES tbl_name READ;
為表增加一個寫鎖定:
mysql>LOCK TABLES tbl_name WRITE;
相關(guān)文章
解決MySQL報錯:You?can‘t?specify?target?table?‘region‘?for?
這篇文章主要給大家介紹了關(guān)于MySQL報錯:You?can‘t?specify?target?table?‘region‘?for?update?in?FROM?clause的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02
Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題
當使用MySQL的GROUP BY語句時,根據(jù)指定的列對結(jié)果進行分組,這種情況通常是由于在 GROUP BY 中選擇的字段與其他非聚合字段不兼容,或者在 SELECT 子句中沒有正確使用聚合函數(shù)所導致的,本文給大家介紹Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題,感興趣的朋友跟隨小編一起看看吧2024-06-06
探究MySQL中索引和提交頻率對InnoDB表寫入速度的影響
這篇文章主要介紹了MySQL中索引和提交頻率對InnoDB表寫入速度的影響,作者通過實際測試運行時間的對比來驗證,需要的朋友可以參考下2015-05-05
sqoop export導出 map100% reduce0% 卡住的多種原因及解決
這篇文章主要介紹了sqoop export導出 map100% reduce0% 卡住的多種原因及解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
mysql 實現(xiàn)互換表中兩列數(shù)據(jù)方法簡單實例
這篇文章主要介紹了mysql 實現(xiàn)互換表中兩列數(shù)據(jù)方法簡單實例的相關(guān)資料,需要的朋友可以參考下2016-10-10
mysql創(chuàng)建表設置表主鍵id從1開始自增的解決方案
在MySQL中用很多類型的自增ID,每個自增ID都設置了初始值,一般情況下初始值都是從0開始,然后按照一定的步長增加(一般是自增 1),下面這篇文章主要給大家介紹了關(guān)于mysql創(chuàng)建表設置表主鍵id從1開始自增的解決方案,需要的朋友可以參考下2023-04-04
MySQL 5.7增強版Semisync Replication性能優(yōu)化
這篇文章主要介紹了MySQL 5.7增強版Semisync Replication性能優(yōu)化,本文著重講解支持發(fā)送binlog和接受ack的異步化、支持在事務commit前等待ACK兩項內(nèi)容,需要的朋友可以參考下2015-05-05

