封鎖機制以及讀鎖和寫鎖的區別

我們在開發中也許都有感受到,數據庫的併發操作會帶來許多問題,比如丟失更新、不可重複讀、讀髒數據(幽靈數據)等等,常見的比如自動售票系統,站點1、2同時讀出剩餘的票數n張,站點1售出一張票,並將n-1寫入數據庫,站點2也售出一張票並將n-1寫入數據庫,但是我們都知道,應剩餘n-2張票,這就是典型的丟失數據更新的實例。爲避免該類問題的產生,我們採用了封鎖機制,簡單點就是當一個線程要對數據庫進行相關操作時,先給數據庫加上適當的鎖,以此來避免其他線程對數據庫進行操作而帶來的干擾。
併發操作之所以產生錯誤,是因爲不同線程併發執行事務互相干擾造成的。所以我們要對事務的併發操作進行控制,即併發控制。一般DBMS進行併發控制的方法是封鎖機制和事務機制。
封鎖就是對數據表、數據行等操作之前,先向系統請求對其加鎖,說通俗點就是操作之前先聲明權限。
封鎖的週期(環節):申請加鎖、獲得鎖權限、釋放鎖權限
最基本的封鎖類型有兩種:排它鎖(Exclusive Locks,X鎖)和共享鎖(Share Locks,S鎖)。

  • 排它鎖也稱獨佔鎖、寫鎖或X鎖,若sessionA獲得某數據表的排他鎖權限,那麼sessionA只能對該表進行讀取或修改,其他session既不能讀取也不能修改該表,更不能對該表加任何類型的鎖,直到sessionA釋放排它鎖權限。加鎖方式:lock tables tablename write;操作如下:
    sessionA:
    這裏寫圖片描述
    sessionB:
    這裏寫圖片描述
    從上圖操作可以看出sessionA獲得ha表排它鎖權限以後sessionB執行訪問ha表操作以後並沒用顯示ha數據而是在等待sessionA釋放鎖權限。

  • 共享鎖也稱讀鎖或S鎖,若sessionA獲得某數據表的共享鎖權限,那麼任何session(包括sessionA)只能對該表進行讀取,不能修改該表,其他session可以對該數據表繼續加S鎖但不能加X鎖,直到sessionA釋放共享鎖權限。加鎖方式:set tables tablename read;操作如下:
    sessionA:
    這裏寫圖片描述
    sessionB:
    這裏寫圖片描述
    從上圖操作可以看出,sessionA獲得ha表共享鎖權限以後,sessionA和sessionB都可以訪問ha表,但是當sessionA想更改ha表時直接報錯(ERROR 1099 (HY000): Table ‘ha’ was locked with a READ lock and can’t be updated ha表有一個共享鎖不能被修改),sessionB更改ha表時並沒有顯示修改成功,而是在等待sessionA釋放共享鎖權限。

  • 注意,在sessionA同時獲得某數據表的S和X鎖權限時,sessionA只能select該數據表,其他session將不能對該表進行任何操作,包括select、update、drop、delete、lock等等,直到sessionA釋放相關鎖權限。

發佈了29 篇原創文章 · 獲贊 57 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章