鎖機(jī)制
意義:解決資源共享,并發(fā)問(wèn)題。
示例:買衣服X
A: X 買了X
B: 看到了X,使得X賣了兩次
解決:買衣服的時(shí)候加個(gè)鎖 -> 試衣服 -> 下單 -> 打包
B想買的時(shí)候發(fā)現(xiàn)了X被加鎖,解鎖的時(shí)候,其他人才能買,買完就可以被看到被買了
分類
- 操作類型
1 讀鎖:共享鎖
同一個(gè)衣服,可以讀操作,互不干擾
2 寫鎖:互斥鎖
如果當(dāng)前寫操作沒(méi)有關(guān)閉,買衣服的一系列操作沒(méi)有完畢,則無(wú)法進(jìn)行其他的讀(帶到試衣間了,也不能讀了),寫鎖。
- 操作范圍
1 表鎖
一次性鎖一張表,如MyISAM,開(kāi)銷小,加鎖快,無(wú)死鎖,但是鎖的范圍大,容易發(fā)生沖突,并發(fā)度低
2 行鎖
一次性對(duì)一條數(shù)據(jù)加鎖,比表鎖沖突的概率低,如InnoDB用的行鎖,開(kāi)銷小,加鎖慢,容易發(fā)生死鎖,很小的概率發(fā)生高并發(fā)問(wèn)題(臟讀,幻讀,不可重復(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)行讀寫操作