什麽是鎖
鎖是計算機用以協調多個進程間並發訪問同一共享資源的一種機製。 MySQL中為了保證數據訪問的一致性與有效性等功能,實現了鎖機製,MySQL中的鎖是在服務器層或者存儲引擎層實現的。
為什麽要了解鎖
在數據庫中,如果多個事務同時對一個數據進行操作,並發的操作若不加控製,可能會讀取和存儲不正確的數據,破壞數據庫的一致性、臟讀、不可重復讀、幻讀等、甚至可能產生死鎖。 如何保證數據並發訪問的一致性,有效性,是所有數據庫必須要解決的問題。 鎖沖突也是影響數據庫並發訪問性能的一個重要因素,因此鎖對數據庫尤其重要。
但是,加鎖是消耗資源的,鎖的各種操作,包括獲得鎖、檢測鎖是否已解除、釋放鎖等 ,都會增加系統的開銷。
鎖類型
我們以一個例子來說明各種鎖類型。 在電商系統中,用戶下單後商品的庫存對應減少,在高並發情況下(秒殺)需保證數據一致性(最終庫存量與減庫存時庫存量一致)。
悲觀鎖
每次在拿數據的時候都會上鎖,保證同一時刻只有一個線程能操作數據,其它線程處於等待狀態。
樂觀鎖
每次取數據時不會上鎖,但是在提交更新的時候會判斷一下在此期間有沒別人更新了這個數據。樂觀鎖適用於讀多寫少的應用場景,這樣可以提高吞吐量。 樂觀鎖一般來說有兩種方式: 1. 使用數據版本(version)記錄機製實現 2. 使用時間戳(timestamp)
分布式鎖
目前常見分布式鎖實現有兩種:基於Redis和基於Zookeeper。這個後面再寫