SQL4

鎖機(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)行讀寫操作
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容