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