一文帶你了解MySQL中的鎖機(jī)制
一.概述
鎖是計(jì)算機(jī)協(xié)調(diào)多個進(jìn)程或線程并發(fā)訪問某一資源的機(jī)制(避免爭搶)。
在數(shù)據(jù)庫中,除傳統(tǒng)的計(jì)算資源(如CPU、RAM、I/O等)的爭用以外,數(shù)據(jù)也是一種供許多用戶共享的資如何保證數(shù)據(jù)并發(fā)訪問的一致性、有效性是所有數(shù)據(jù)庫必須解決的一個問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個重要因素。從這個角度來說,鎖對數(shù)據(jù)庫而言顯得尤其重要,也更加復(fù)雜。
分類
1、從對數(shù)據(jù)操作的粒度分
- 表鎖:操作時,會鎖定整個表。
- 行鎖:操作時,會鎖定當(dāng)前操作行。
2、從對數(shù)據(jù)操作的類型分
- 讀鎖(共享鎖):針對同一份數(shù)據(jù),多個讀操作可以同時進(jìn)行而不會互相影響。
- 寫鎖(排它鎖):當(dāng)前操作沒有完成之前,它會阻斷其他寫鎖和讀鎖。
相對其他數(shù)據(jù)庫而言,MySQL的鎖機(jī)制比較簡單,其最顯著的特點(diǎn)是不同的存儲引擎支持不同的鎖機(jī)制。下表中羅列出了各存儲引擎對鎖的支持情況:
存儲引擎 | 表級鎖 | 行級鎖 |
MylSAM | 支持 | 不支持 |
lnnoDB | 支持 | 支持 |
MEMORY | 支持 | 不支持 |
BDB | 支持 | 不支持 |
MySQL鎖的特性可大致歸納如下:
鎖類型 | 特點(diǎn) |
表級鎖 | 偏向MyISAM存儲引擎,開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。 |
行級鎖 | 偏向InnoDB存儲引擎,開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。 |
從上述特點(diǎn)可見,很難籠統(tǒng)地說哪種鎖更好,只能就具體應(yīng)用的特點(diǎn)來說哪種鎖更合適! 僅從鎖的角度來說:表級鎖更適合于以查詢?yōu)橹鳎挥猩倭堪此饕龡l件更新數(shù)據(jù)的應(yīng)用,如web應(yīng)用;
而行級鎖則更適合于有大量按索引條件并發(fā)更新少量不同數(shù)據(jù),同時又有并查詢的應(yīng)用,如一些在線事務(wù)處理(OLTP)系統(tǒng)。
二.MyISAM表鎖
MylSAM存儲引擎只支持表鎖
如何加表鎖
MylSAM在執(zhí)行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執(zhí)行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程并不需要用戶干預(yù),因此,用戶一般不需要直接用LOCK TABLE命令給MylSAM表顯式加鎖。
讀鎖演示
create database test_lock; use test_lock; drop table tb_book ; create table tb_book( id int(11) auto_increment, name varchar(50) default null, publish_time date default null, status char(1) default null, primary key (id) )engine=myisam default charset=utf8; insert into tb_book values(null,'sql','2088-08-01','1'); insert into tb_book values(null,'sql',20880908,'0'); create table tb_user( id int(11) auto_increment, name varchar(50) default null, primary key (id) )engine =myisam default charset=utf8; insert into tb_user values(null,'張三'); insert into tb_user values(null,'李四'); -- 加讀鎖 lock table tb_book read; select * from tb_book ;-- 能正常輸出 select * from tb_book tb ;-- 不能正常輸出,不能有別名 update tb_book set status=1;-- 不能正常輸出 讀鎖:可讀不可改 select * from tb_user ;-- 不能正常輸出,當(dāng)鎖住一個表時也不能看其他表 -- 解鎖 unlock tables;
加了讀鎖后只能看自己的表,不能修改,也不能看其他的表
寫鎖演示
create table tb_book( id int(11) auto_increment, name varchar(50) default null, publish_time date default null, status char(1) default null, primary key (id) )engine=myisam default charset=utf8; insert into tb_book values(null,'sql','2088-08-01','1'); insert into tb_book values(null,'sql',20880908,'0'); create table tb_user( id int(11) auto_increment, name varchar(50) default null, primary key (id) )engine =myisam default charset=utf8; insert into tb_user values(null,'張三'); insert into tb_user values(null,'李四'); -- 加寫鎖 lock table tb_book write; select * from tb_book ;-- 能正常輸出 select * from tb_book tb ;-- 不能正常輸出,不能有別名 update tb_book set status=1;-- 可以修改 寫鎖:可讀可修改,但在沒有解鎖之前不能被其他人查看,會被掛起 select * from tb_user ;-- 不能正常輸出,當(dāng)鎖住一個表時也不能看其他表 -- 解鎖 unlock tables;
三.InnoDB行鎖
行鎖特點(diǎn)
行鎖特點(diǎn)︰偏向InnoDB存儲引擎,開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
InnoDB與 MylSAM的最大不同有兩點(diǎn):一是支持事務(wù);二是采用了行級鎖。
行鎖模式
lnnoDB實(shí)現(xiàn)了以下兩種類型的行鎖。
1、共享鎖(S)∶又稱為讀鎖,簡稱s鎖,共享鎖就是多個事務(wù)對于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。
2、排他鎖(x):又稱為寫鎖,簡稱x鎖,排他鎖就是不能與其他鎖并存,如一個事務(wù)獲取了一個數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務(wù)是可以對數(shù)據(jù)就行讀取和修改。
對于UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數(shù)據(jù)集加排他鎖(x);
對于普通SELECT語句,InnoDB不會加任何鎖;
可以通過以下語句顯示給記錄集加共享鎖或排他鎖。
-- 行鎖 drop table is exists test_innodb_lock; create table test_innodb_lock( id int(11), name varchar(16), sex varchar(1) )engine=innodb; insert into test_innodb_lock values(1,'100','1'), (2,'200','0'), (3,'200','1'), (4,'300','0'), (5,'400','0'), (6,'500','1'), (7,'600','1'), (1,'700','1'); create index index_id on test_innodb_lock(id); create index index_name on test_innodb_lock(name);
可以修改是因?yàn)樯厦娴男墟i只對id=1的那兩行加了排他鎖
到此這篇關(guān)于一文帶你了解MySQL中的鎖機(jī)制的文章就介紹到這了,更多相關(guān)MySQL鎖機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安裝配置mysql及Navicat prenium的詳細(xì)流程
這篇文章主要介紹了安裝配置mysql及Navicat Premium的詳細(xì)流程,配置方法也真的很簡單,本文給大家詳細(xì)介紹mysql Navicat Premium安裝配置相關(guān)知識感興趣的朋友,一起學(xué)習(xí)吧2021-06-06mysql 8.0.15 安裝配置方法圖文教程(Windows10 X64)
這篇文章主要為大家詳細(xì)介紹了Windows10 X64 mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03MySQL安裝starting?the?server失敗的2種解決辦法(推薦!)
MySQL是一個非常強(qiáng)大的關(guān)系型數(shù)據(jù)庫,但有些初學(xué)者在安裝配置的時候,遇到種種的困難,下面這篇文章主要給大家介紹了關(guān)于MySQL安裝starting?the?server失敗的2種解決辦法,需要的朋友可以參考下2023-04-04MySQL性能優(yōu)化之max_connections配置參數(shù)淺析
這篇文章主要介紹了MySQL性能優(yōu)化之max_connections配置參數(shù)淺析,本文著重講解了3種配置max_connections參數(shù)的方法,需要的朋友可以參考下2014-07-07在win10系統(tǒng)下安裝Mysql 5.7.17圖文教程
因?yàn)橄胍诠倦娔X上安裝Mysql,于是到官網(wǎng)上下載了最新版本的Mysql-5.7.17,其實(shí)安裝方法也很簡單,下面小編把安裝過程分享到腳本之家平臺供大家參考2017-03-03