數據庫鎖的基本原理


數據庫鎖的基本原理

為了保證數據的完事性和一致性,數據庫系統采用鎖來實現事務的隔離性。各種大型數據庫采用的鎖基本理論是一致的,但在具體實現上各有差別。

從並發事務鎖定的關系上看,可以分為共享鎖定和獨占鎖定。從鎖定的對象不同,一般可以分為表鎖定和行鎖定。

共享鎖用於讀取數據操作,它是非獨占的,允許其他事務同時讀取其鎖定的資源,但不允許其他事務更新它。

獨占鎖也叫排他鎖,適用於修改數據的場合。它所鎖定的資源,其他事務不能讀取也不能修改。

當一個事務訪問某種數據庫資源時,如果執行select語句,必須先獲得共享鎖,如果執行insertupdatedelete語句,必須獲得獨占鎖,這些鎖用於鎖定被操作的資源。

當第二個事務也要訪問相同的資源時,如果執行select語句,也必須先獲得共享鎖,如果執行insertupdatedelete語句,也必須獲得獨占鎖。此時根據已經旋轉在資源上的鎖的類型,來決定第二個事務應該等待第一個事務解除對應資源的鎖定,還是可以立刻獲得鎖。

資源上已經放置的鎖

第二個事務進行讀操作

第二個事務進行更新操作

立即獲得共享鎖

立即獲得獨占鎖

共享鎖

立即獲得共享鎖

等待第一個事務解除共享鎖

獨占鎖

等待第一個事務解除獨占鎖

等待第一個事務解除獨占鎖

 

1 共享鎖

1、加鎖的條件:當一個事務執行select語句時,數據庫系統會為這個事務分配一把共享鎖,來鎖定被查詢的數據。

2、解鎖的條件:在默認情況下,數據被讀取后,數據庫系統立即解除共享鎖。例如,當一個事務執行查詢“SELECT * FROM accounts”語句時,數據庫系統首先鎖定第一行,讀取之后,解除對第一行的鎖定,然后鎖定第二行。這樣,在一個事務讀操作過程中,允許其他事務同時更新accounts表中未鎖定的行。

3、與其他鎖的兼容性:如果數據資源上放置了共享鎖,還能再放置共享鎖和更新鎖。

4、並發性能:具有良好的並發性能,當數據被放置共享鎖后,還可以再放置共享鎖或更新鎖。所以並發性能很好。 

2 獨占鎖

1、加鎖的條件:當一個事務執行insertupdatedelete語句時,數據庫系統會自動對SQL語句操縱的數據資源使用獨占鎖。如果該數據資源已經有其他鎖(任何鎖)存在時,就無法對其再放置獨占鎖了。

2、解鎖的條件:獨占鎖需要等到事務結束才能被解除。

3、兼容性:獨占鎖不能和其他鎖兼容,如果數據資源上已經加了獨占鎖,就不能再放置其他的鎖了。同樣,如果數據資源上已經放置了其他鎖,那么也就不能再放置獨占鎖了。

4、並發性能:不用說了,最差。只允許一個事務訪問鎖定的數據,如果其他事務也需要訪問該數據,就必須等待,起到前一個事務結束,解除了獨占鎖,其他事務才有機會訪問該數據。

3 更新鎖

更新鎖在的初始化階段用來鎖定可能要被修改的資源,這可以避免使用共享鎖造成的死鎖現象。例如,對於以下的update語句:

UPDATE accounts SET balance=900 WHERE id=1

更新操作需要分兩步:

l 讀取accounts表中id1的記錄。

l 執行更新操作。

如果在第一步使用共享鎖,再第二步把鎖升級為獨占鎖,就可能出現死鎖現象。例如:兩個事務都獲取了同一數據資源的共享鎖,然后都要把鎖升級為獨占鎖,但需要等待另一個事務解除共享鎖才能升級為獨占鎖,這就造成了死鎖。

更新鎖有如下特征:

l 加鎖的條件:當一個事務執行update語句時,數據庫系統會先為事務分配一把更新鎖。

l 解鎖的條件:當讀取數據完畢,執行更新操作時,會把更新鎖升級為獨占鎖。

l 與其他鎖的兼容性:更新鎖與共享鎖是兼容的,也就是說,一個資源可以同時放置更新鎖和共享鎖,但是最多放置一把更新鎖。這樣,當多個事務更新相同的數據時,只有一個事務能獲得更新鎖,然后再把更新鎖升級為獨占鎖,其他事務必須等到前一個事務結束后,才能獲取得更新鎖,這就避免了死鎖。

l 並發性能:允許多個事務同時讀鎖定的資源,但不允許其他事務修改它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM