數據庫鎖機制的理解

獨佔鎖(X鎖):INSERT UPDATE DELETE 時,自動加X鎖。(我用了X,只有我可以讀寫)
共享鎖(S鎖):SELECT 時,自動加S鎖,其他用戶可查詢不可修改。(大家都可以來S讀,不能X寫)
更新鎖(U鎖):加了U鎖,只能查詢(S鎖),帶U鎖的查詢都不行。(雖然我現在只是U讀,但是我將來會要寫,在我X寫之前你們可以S方式讀)

 

 

 

共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁; 通常是該頁被讀取完畢,S鎖立即被釋放。 
排它(X)鎖:僅允許一個事務封鎖此頁;其他任何事務必須等到X鎖被釋放才能對該頁進行訪問;X鎖一直到事務結束才能被釋放。 
更新(U)鎖:用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖;當被讀取的頁將要被更新時,則升級爲X鎖;U鎖一直到事務結束時才能被釋放。

 

 

用戶A讀一條紀錄,然後修改該條紀錄
    這是用戶B修改該條紀錄
    這裏用戶A的事務裏鎖的性質由共享鎖企圖上升到獨佔鎖(for update),而用戶B裏的獨佔鎖由於A有共享鎖存在所以必須等A釋放掉共享鎖,而A由於B的獨佔鎖而無法上升的獨佔鎖也就不可能釋放共享鎖,於是出現了死鎖。
    這種死鎖比較隱蔽,但其實在稍大點的項目中經常發生。
解決方法:
    讓用戶A的事務(即先讀後寫類型的操作),在select 時就是用Update lock
    語法如下:
    select * from table1 with(updlock) where ....

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