鎖:計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或線程并發(fā)訪問某一資源的機(jī)制。
在數(shù)據(jù)庫中,除傳統(tǒng)的計(jì)算資源(如CPU、RAM、I/O等)的爭(zhēng)用外,數(shù)據(jù)也是一種供許多用戶共享的資源。如何保證數(shù)據(jù)并發(fā)的一致性、有效性是所有數(shù)據(jù)庫必須解決的一個(gè)問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個(gè)重要因素。從這個(gè)角度來說,鎖對(duì)數(shù)據(jù)庫而言顯得尤為重要,也更復(fù)雜。
鎖的分類
1)從對(duì)數(shù)據(jù)操作的類型分為讀鎖和寫鎖
2)從對(duì)數(shù)據(jù)操作的粒度分主要有表鎖和行鎖
讀鎖和寫鎖:
讀鎖(共享鎖):針對(duì)同一份數(shù)據(jù),多個(gè)讀操作可以同時(shí)進(jìn)行而不會(huì)互相影響。
寫鎖(排他鎖):當(dāng)前寫操作沒有完成前,它會(huì)阻斷其他讀和寫操作。
表鎖
先看一些命令
我們可以手動(dòng)對(duì)一張表加鎖,可以是讀鎖或者寫鎖,命令:
lock table 表名 read/write,表名 read/write,……
查看表有沒有鎖的命令
show open tables;
In_use的值是0代表沒鎖,是1代表有鎖。
現(xiàn)在數(shù)據(jù)庫中有一張表,test_lock,現(xiàn)在手動(dòng)給它加鎖,進(jìn)行一些操作測(cè)試。
一、加讀鎖
lock table test_lock read;
加鎖成功,可以用show open tables命令查看
現(xiàn)在可以做一些操作。
1、讀被鎖的表:
select * from test_lock;
在當(dāng)前連接中:
可以查詢到結(jié)果。
在新連接中:
新的連接同樣可以查詢被鎖的表。
2、查詢庫中其他表:
select * from test2;
在當(dāng)前連接中:
結(jié)果報(bào)錯(cuò),無法查詢。
在新連接中:
正常,沒有影響。
3、更新被鎖的表:
update test_lock set name = 'abcd' where id = '1';
在當(dāng)前連接中:
無法更新。
在新連接中:
執(zhí)行此語句后,會(huì)發(fā)現(xiàn)一直在等待,即阻塞了,直到我們把表的鎖釋放。
釋放鎖命令:unlock table;
執(zhí)行釋放命令后,新連接中的update語句也馬上有了反應(yīng),
執(zhí)行等待了1分多鐘。
4、更新庫中其他表:
update test2 set name = 'a2' where id = '1';
在當(dāng)前連接中:
無法更新
在新連接中:
在新的會(huì)話中,更新其他表是沒有影響的。
二、加寫鎖
lock table test_lock write;
同樣,我們?cè)诋?dāng)前會(huì)話和和新會(huì)話中做一些操作對(duì)比。
1、讀被鎖的表:
select * from test_lock;
當(dāng)前會(huì)話中:
讀沒有影響。
新的會(huì)話中:
此時(shí)會(huì)被阻塞,需要等待釋放鎖。
2、查詢庫中其他表:
select * from test2;
當(dāng)前會(huì)話中:
其他表不能查詢。
新的會(huì)話中:
此時(shí)不受影響。
3、更新被鎖的表:
update test_lock set name = 'abcd' where id = '2';
當(dāng)前會(huì)話中:
可以更新。
新的會(huì)話中:
結(jié)果是被阻塞。
4、更新庫中其他表
update test2 set name = 'a2' where id = '2';
當(dāng)前會(huì)話中:
此時(shí)不可以更新其他表。
新的會(huì)話中:
更新其他表時(shí)候沒有問題。
以上是對(duì)表分別加讀鎖和寫鎖,然后進(jìn)行的一些操作對(duì)比,重要的關(guān)注在其他會(huì)話中對(duì)被鎖表的讀寫請(qǐng)求。
對(duì)表加讀鎖,不會(huì)阻塞其他進(jìn)行對(duì)同一表的讀請(qǐng)求,但會(huì)阻塞對(duì)同一表的寫請(qǐng)求。只有當(dāng)讀鎖釋放后,才會(huì)執(zhí)行其他執(zhí)行進(jìn)行的寫操作。
對(duì)表加寫鎖,會(huì)阻塞其他進(jìn)程對(duì)同一表的讀和寫的請(qǐng)求,只有當(dāng)寫鎖釋放后,才會(huì)執(zhí)行其它進(jìn)程的讀寫操作。






