資料庫鎖 學習筆記

2021-10-10 01:35:50 字數 2862 閱讀 5733

資料庫鎖的分類:

(1)按鎖的粒度劃分:分為表級鎖、行級鎖、頁級鎖

(2)按照鎖級別劃分:分為共享鎖、排它鎖

(3)按照加鎖方式劃分:分為隱式鎖(內部自動加鎖)、顯示鎖(顯示的新增鎖)

(4)按照使用方式劃分:分為樂觀鎖悲觀鎖

資料庫中不同的儲存引擎支援不同的鎖機制

1、表級鎖:

開銷小,加鎖快;不會出現死鎖,發生鎖衝突的概率最高;併發度最低

表鎖鎖定整張表,乙個使用者在對錶進行寫操作前(插入、刪除和更新等),需要先獲得寫鎖,這會阻塞其他使用者在對該錶的所有讀操作。只有沒有寫鎖時,其他使用者才能獲得讀鎖,讀鎖之間是不相互阻塞的。

寫鎖比讀鎖的優先順序更高,所以乙個寫鎖請求可能會被插入到讀鎖的前面。反之讀鎖不能插入到寫鎖前面。

1、在mysql中,表鎖不會有死鎖發生,因為在加表鎖前,要先解鎖已有的表鎖

2、表鎖時,會鎖定表以及表中的所有資料,對該錶的任何請求幾乎都可能會被阻塞,所以說衝突最多

3、鎖衝突是乙個事務持有某條資料的寫鎖,兩乙個事務也要請求同一條資料的寫鎖,就會被阻塞。

2、行級鎖:

開銷大,加鎖慢;會出現死鎖;鎖粒度最小,發生鎖衝突的概率最低,併發度也最高。

3、頁面鎖:

開銷和加鎖時間介於表鎖和行鎖之間;會出現死鎖;鎖粒度介於表鎖和行鎖之間,併發度一般。

下面我們主要來看innodb行級鎖分類:共享鎖和排他鎖

共享鎖(s)

共享鎖又稱讀鎖,多個事務對同乙個資料行共享著同一把鎖;乙個事務在對乙個資料進行讀操作的時候,其他事務也可以訪問到資料。

排他鎖(x)

排他鎖又稱為寫鎖,乙個事務擁有了乙個資料的寫鎖可以對該資料進行讀寫,其他事務就不能獲得該資料的寫鎖。

1、排他鎖使用於鎖定杭機路後需要進行更新操作的應用。

2、mysql innodb引擎中update、delete、insert自動加排他鎖

3、普通的select語句會自動加共享鎖

此外innodb內部還自動新增意向共享鎖(ls)和意向排他鎖(lx)

意向共享鎖(ls):事務打算給資料行共享鎖;事務在給乙個資料行加共享鎖前必須先取得該錶的意向共享鎖。相當於要加排他鎖先要獲取意願。

意向排他鎖(lx):事務打算給資料行排他鎖;事務在給乙個資料行加排他鎖前必須先取得該錶的意向排他鎖。

對於上表:意向鎖之間都是相容的;共享鎖與共享鎖之間相容;共享鎖與意向共享鎖之間相容

相容指的是如果當前鎖模式和要請求的鎖模式相容的話,請求的鎖就會加在該事務上,如果不相容就只能等待當前的鎖釋放。
意向鎖存在的意義:提高效率

如果沒有意向鎖,事務就需要一行一行的區檢查每個資料航上是否有共享鎖或者排他鎖

有了意向鎖就只需要檢查該錶上是否有意向鎖而不必一行一行的去檢查。

例如:

1、事務a獲取了乙個表中的某一行資料的排他鎖;

2、事務b想獲取該錶的共享鎖,由於共享鎖和排他鎖互斥,所以事務b必須知道當前是否有其他事務持有表中任意一條記錄的排他鎖。

3、當事務b檢測到a已經持有該錶的意向排他鎖的時候就會知道a肯定持有該表中某條記錄的排他鎖,就不需要一行一行區檢測了。

《高效能mysql》中說:死鎖是指兩個或者多個事務在同乙個資源上相互占用,並請求鎖定對方占有的資源,從而導致惡性迴圈的現象。如果沒有外力的作用,都無法推進下去。

例如:仿照《高效能mysql》中的例子

student表

事務1:

start

transaction

;update student set score=

85where stu_id =4;

update student set score=

90where stu_id =3;

commit

;事務2:

start

transaction

;update student set score=

85where stu_id =3;

update student set score=

90where stu_id =4;

commit

;1、如果兩個事物都執行了第一條語句,更新了一行資料,同時也鎖定了該行資料

2、接著每個事務都去嘗試執行第二條更新語句,就會發現改行已經被對方鎖定

3、然後兩個事物都等待對方釋放鎖,但又持有對方鎖需要的鎖,這樣就會進入死迴圈。

4、只有外力的作用才能解除死鎖。

死鎖的關鍵就在於:兩個或多個事務加鎖的順序不一致

樂觀鎖樂觀鎖顧名思義持有樂觀的態度,每次對資料進行操作都認為別人不會修改資料,所以一開始不會上鎖,但是會在更新的時候回判斷在此期間是否有人修改了該資料。

利用版本號機制和cas演算法實現判斷是否有人修改了資料
悲觀鎖

先獲取鎖再進行操作。

悲觀鎖顧名思義就是一種悲觀的態度,每次進行操作的時候都會認為別人會修改資料,所以每一進行操作的時候都會加上鎖。

樂觀鎖和悲觀鎖的使用場景:

樂觀鎖:適用於寫操作較少,讀操作多的場景。這樣就可以省去鎖的開銷。

悲觀鎖:適用於寫操作多的場景。

資料庫筆記2 鎖

1 互斥鎖 當有乙個執行緒要訪問共享資源 臨界資源 之前,會對執行緒訪問的這段 臨界區 進行加鎖。如果在加鎖之後沒釋放鎖之前其他執行緒要對臨界資源進行訪問,則這些執行緒會被阻塞睡眠,直到解鎖,如果解鎖時有乙個或者多個執行緒阻塞,那麼這些鎖上的執行緒就會變成就緒狀態,然後第乙個變為就緒狀態的執行緒就會...

資料庫學習 MySQL鎖

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制 顯著特點是不同的儲存引擎支援不同的鎖機制 兩種模式 表 共享鎖 讀鎖 級別 表 獨佔鎖 排他鎖 寫鎖 表級鎖的儲存引擎 myisam 引擎 memory 引擎 不能訪問別的表 myisam在執行查詢語句 select 前,會自動給涉及的所有表加讀...

MYSQL資料庫學習筆記十一 讀寫鎖

1.鎖介紹參考部落格 按照鎖的粒度來說,mysql主要包含三種型別 級別 的鎖定機制 全域性鎖 鎖的是整個database。由mysql的sql layer層實現的 表級鎖 鎖的是某個table。由mysql的sql layer層實現的 show open tables 行級鎖 鎖的是某行資料,也可...