鎖機(jī)制
意義:解決資源共享砾淌,并發(fā)問題。
示例:買衣服X
A: X 買了X
B: 看到了X缕坎,使得X賣了兩次
解決:買衣服的時(shí)候加個(gè)鎖 -> 試衣服 -> 下單 -> 打包
B想買的時(shí)候發(fā)現(xiàn)了X被加鎖,解鎖的時(shí)候,其他人才能買郊丛,買完就可以被看到被買了
分類
- 操作類型
1 讀鎖:共享鎖
同一個(gè)衣服,可以讀操作瞧筛,互不干擾
2 寫鎖:互斥鎖
如果當(dāng)前寫操作沒有關(guān)閉厉熟,買衣服的一系列操作沒有完畢,則無法進(jìn)行其他的讀(帶到試衣間了较幌,也不能讀了)揍瑟,寫鎖。
- 操作范圍
1 表鎖
一次性鎖一張表乍炉,如MyISAM绢片,開銷小,加鎖快岛琼,無死鎖底循,但是鎖的范圍大,容易發(fā)生沖突槐瑞,并發(fā)度低
2 行鎖
一次性對(duì)一條數(shù)據(jù)加鎖熙涤,比表鎖沖突的概率低,如InnoDB用的行鎖困檩,開銷小灭袁,加鎖慢,容易發(fā)生死鎖窗看,很小的概率發(fā)生高并發(fā)問題(臟讀茸歧,幻讀,不可重復(fù)讀显沈,丟失更新)
死鎖软瞎,兩個(gè)數(shù)據(jù)都在相互等待對(duì)方
- 例子
表鎖:
//自增操作逢唤,MySQL/SQL server可以,oracal不支持
create table tablelock(
id int primary key auto_increment,
name varchar(20)
)engine myisam;
insert into tablelock(name) values('a1');
insert into tablelock(name) values('a2');
insert into tablelock(name) values('a3');
insert into tablelock(name) values('a4');
commit;
增加鎖
local table 表 read/write
加一個(gè)讀鎖
lock table tablelock read;
釋放鎖
unlock tablelock;
讀取表的狀態(tài)
show open tables;
image.png
加了一個(gè)讀鎖涤浇,試圖刪除表的一列鳖藕,會(huì)報(bào)錯(cuò),讀取就可以
加鎖讀
會(huì)話對(duì)A加了讀鎖只锭,那么也不能對(duì)其他表進(jìn)行讀寫
image.png
其他會(huì)話進(jìn)行寫操作著恩,會(huì)一直等待
image.png
增加寫鎖
會(huì)話0:
lock table tablelock write;
- 當(dāng)前會(huì)話可以對(duì)該表進(jìn)行增刪改查,但是不能對(duì)其他的表進(jìn)行操作
- 可以對(duì)上面表進(jìn)行增刪改查蜻展,但是要上面釋放鎖
總結(jié)
MyISAM在對(duì)表格進(jìn)行寫操作的時(shí)候喉誊,會(huì)對(duì)表加寫鎖,讀的時(shí)候加上讀鎖纵顾,所以會(huì)有下面的情況:
- 對(duì)一個(gè)表讀的時(shí)候伍茄,會(huì)對(duì)表進(jìn)行加讀鎖,其他進(jìn)行可以讀施逾,但是不能夠?qū)懛蠼茫挥挟?dāng)寫鎖
- 對(duì)一個(gè)表寫的時(shí)候,會(huì)對(duì)表進(jìn)行加寫鎖汉额,其他會(huì)話都不能進(jìn)行讀寫操作