mysql 鎖機制解析

爲什麼加鎖

無論何時,只要有多個查詢需要在同一時刻修改數據,就會有併發控制的問題。
我們以 unix 系統的email box 爲例。典型的 mbox 文件格式是非常簡單的。一個mbox中所有的郵件都串行在一起,彼此首尾相連。這種格式對於讀取和分析郵件信息非常友好,同時投遞郵件也很容易,只要在文件末尾附加新的郵件內容即可。

那如果兩個進程同時投遞郵件會怎樣?可想而知,如果不增加鎖機制,郵件內容勢必會亂序追加,這肯定是不合理的。
like this…
在這裏插入圖片描述

那如果一個進程正在讀郵件,而另一個進程要刪除郵件,又該怎麼辦?結果是不可預知的,可能是讀取到錯誤的內容,也可能會報錯退出。
在這裏插入圖片描述
當然涉及良好的郵箱投遞系統會通過鎖(lock)來防止上述問題的發生。

讀寫鎖

那如果我們把數據庫中的表類比成Unix 的 email box ,數據中的的一行數據比作一封郵件。就不難發現,數據庫也會存在這樣的併發問題。解決這類經典問題的方法就是併發控制,而加鎖就是一種途徑。

再回到我們的郵件系統遇到的問題上:

如果A進程發郵件的同時,B進程也要發郵件,怎麼才能避免亂序追加呢。那就是加鎖,在A進程發郵件的時候,給郵件系統加鎖,禁止其他進程修改或查看郵件。只有在A進程處理完之後,其他進程纔可以介入。這種加鎖方式就是寫鎖,因爲這種加鎖方式是完全佔有,排斥其他進程的任何操作,所以也叫排他鎖

如果A進程讀郵件的同時,B進程又要修改郵件呢。那當然還是加鎖了,A進程讀郵件的時候,先加鎖,但是這個鎖是區別於寫鎖的,因爲如果B進程也是來讀郵件,是不會影響A的,但是要修改肯定是不行的。所以這種加鎖方式就叫做讀鎖,因爲這種加鎖方式並非完全佔有,可以跟其他進程共享讀操作,所以也叫共享鎖

在實際的數據庫系統中,每時每刻都在發生鎖,當用戶在修改某一部分數據時,Mysql會通過加鎖來防止其他用戶讀取同一數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章