索引和鎖是資料庫中的兩個核心知識點,隔離級別的實現都是通過鎖來完成的
鎖用來對資料進行鎖定,我們可以從鎖定物件的粒度大小來對鎖進行劃分,分別為行鎖、頁鎖和表鎖。
還有區鎖和資料庫鎖.
每個層級的鎖數量是有限制的,因為鎖會占用記憶體空間,鎖空間的大小是有限的。當某個層級的鎖數量超過了這個層級的閾值時,就會進行鎖公升級。鎖公升級就是用更大粒度的鎖替代多個更小粒度的鎖,比如 innodb 中行鎖公升級為表鎖,這樣做的好處是占用的鎖空間降低了,但同時資料的併發度也下降了。
共享鎖和排它鎖
當我們對資料進行更新的時候,也就是insert、delete或者update的時候,資料庫也會自動使用排它鎖,防止其他事務對該資料行進行操作。
意向鎖(intent lock),簡單來說就是給更大一級別的空間示意裡面是否已經上過鎖。
樂觀鎖(optimistic locking)認為對同一資料的併發操作不會總發生,屬於小概率事件,不用每次都對資料上鎖,也就是不採用資料庫自身的鎖機制,而是通過程式來實現。在程式上,我們可以採用版本號機制或者時間戳機制實現。
在表中設計乙個版本字段 version,第一次讀的時候,會獲取 version 欄位的取值。然後對資料進行更新或刪除操作時,會執行update ... set version=version+1 where version=version。此時如果已經有事務對這條資料進行了更改,修改就不會成功。
時間戳和版本號機制一樣,也是在更新提交的時候,將當前資料的時間戳和更新之前取得的時間戳進行比較,如果兩者一致則更新成功,否則就是版本衝突。
悲觀鎖(pessimistic locking)也是一種思想,對資料被其他事務的修改持保守態度,會通過資料庫自身的鎖機制來實現,從而保證資料操作的排它性。
樂觀鎖和悲觀鎖並不是鎖,而是鎖的設計思想。
避免死鎖的發生:
mysql悲觀鎖和樂觀鎖
mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...
MySQL悲觀鎖和樂觀鎖
引言 之所以叫做悲觀鎖,是因為這是一種對資料的修改抱有悲觀態度的併發控制方式。我們一般認為資料被併發修改的概率比較大,所以需要在修改之前先加鎖。例子 0.開始事務 begin 1.查詢出商品庫存資訊 select quantity from items where id 1 for update 2...
悲觀鎖和樂觀鎖
1.悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...