一、mysql有排他鎖為什么還需要共享鎖
共享鎖又稱(chēng)為讀鎖,簡(jiǎn)稱(chēng)S鎖,顧名思義,共享鎖就是多個(gè)事務(wù)對(duì)于同一數(shù)據(jù)可以共享一把鎖,都能訪(fǎng)問(wèn)到最新數(shù)據(jù)。如果只有一個(gè)事務(wù)拿到了共享鎖,則該事務(wù)可以對(duì)數(shù)據(jù)進(jìn)行 UPDATE DETELE 等操作。如果有多個(gè)事務(wù)拿到了共享鎖,則所有事務(wù)都不能對(duì)數(shù)據(jù)進(jìn)行 UPDATE DETELE 等操作。
排他鎖又稱(chēng)為寫(xiě)鎖,簡(jiǎn)稱(chēng)X鎖,顧名思義,排它鎖不能與其它鎖并存,而且只有一個(gè)事務(wù)能拿到某一數(shù)據(jù)行的排它鎖,其余事務(wù)不能再獲取該數(shù)據(jù)行的所有鎖。
只有一個(gè)事務(wù)能獲取該數(shù)據(jù)的排它鎖;一旦有一個(gè)事務(wù)獲取了該數(shù)據(jù)的排它鎖之后,其余事務(wù)對(duì)于該數(shù)據(jù)的操作將會(huì)被阻塞,直至鎖釋放。
因?yàn)榕潘i只允許一個(gè)事務(wù)獲取,所以如果是業(yè)務(wù)繁忙的情況下,一旦有某個(gè)業(yè)務(wù)不能及時(shí)的釋放鎖,則會(huì)導(dǎo)致其它事務(wù)的鎖等待、鎖等待超時(shí)、死鎖等問(wèn)題;
雖然共享鎖可以給多個(gè)事務(wù)共享,但一旦有多個(gè)事務(wù)同時(shí)擁有共享鎖,則所有事務(wù)都不能對(duì)數(shù)據(jù)進(jìn)行 UPDATE DETELE 等操作,也會(huì)導(dǎo)致其它事務(wù)的鎖等待、鎖等待超時(shí)、死鎖等問(wèn)題;
都會(huì)影響數(shù)據(jù)庫(kù)的并發(fā)能力。
延伸閱讀:
二、并發(fā)鎖
在一定條件下,MyISAM也支持查詢(xún)和操作的并發(fā)進(jìn)行。
MyISAM存儲(chǔ)引擎有一個(gè)系統(tǒng)變量concurrent_insert,專(zhuān)門(mén)用以控制其并發(fā)插入的行為,其值分別可以為0、1或2。
當(dāng)concurrent_insert設(shè)置為0時(shí),不允許并發(fā)插入。
當(dāng)concurrent_insert設(shè)置為1時(shí),如果MyISAM允許在一個(gè)讀表的同時(shí),另一個(gè)進(jìn)程從表尾插入記錄。這也是MySQL的默認(rèn)設(shè)置。
當(dāng)concurrent_insert設(shè)置為2時(shí),無(wú)論MyISAM表中有沒(méi)有空洞,都允許在表尾插入記錄,都允許在表尾并發(fā)插入記錄。
可以利用MyISAM存儲(chǔ)引擎的并發(fā)插入特性,來(lái)解決應(yīng)用中對(duì)同一表查詢(xún)和插入鎖爭(zhēng)用。例如,將concurrent_insert系統(tǒng)變量為2,總是允許并發(fā)插入;同時(shí),通過(guò)定期在系統(tǒng)空閑時(shí)段執(zhí)行OPTIONMIZE TABLE語(yǔ)句來(lái)整理空間碎片,收到因刪除記錄而產(chǎn)生的中間空洞。