Mysql的鎖機制

2021-09-23 14:06:55 字數 1464 閱讀 5683

鎖機制

定義:當有事務操作時,資料庫引擎會要求不同型別的鎖定,如相關資料行、資料頁或是整個資料表,當鎖定執行時,會阻止其他事務對已經鎖定的資料行、資料頁或資料表進行操作。只有在當前事務對於自己鎖定的資源不在需要時,才會釋放其鎖定的資源,供其他事務使用。

我個人對鎖的理解是,某執行緒想要執行某個事務中的某條sql,必須得有某個鎖。如果沒有該鎖,要等待自己獲得該鎖後才能執行相應操作。

共享鎖(share)

共享鎖的代號是s,共享鎖的鎖粒度是行或者元組(多個行)。乙個事務獲取了共享鎖之後,可以對鎖定範圍內的資料執行讀操作。

排它鎖(exclusive)

排它鎖的代號是x,是exclusive的縮寫,排它鎖的粒度與共享鎖相同,也是行或者元組。乙個事務獲取了排它鎖之後,可以對鎖定範圍內的資料執行寫操作。

意向鎖

意向鎖的含義是如果對乙個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對錶加鎖時,就不再需要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提高。

簡單的說就是我要對哪個表進行事務操作了,就給哪個表加乙個意向鎖。

鎖的互斥與相容關係

鎖和鎖之間的關係,要麼是相容的,要麼是互斥的。

鎖a和鎖b相容是指:操作同樣一組資料時,如果事務t1獲取了鎖a,另乙個事務t2還可以獲取鎖b;

鎖a和鎖b互斥是指:操作同樣一組資料時,如果事務t1獲取了鎖a,另乙個事務t2在t1釋放鎖a之前無法獲取鎖b。

上面提到的共享鎖、排它鎖、意向共享鎖、意向排它鎖相互之前都是有相容/互斥關係的,可以用乙個相容性矩陣表示(y表示相容,n表示互斥):

悲觀鎖和樂觀鎖

悲觀鎖(pessimistic lock), 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖(optimistic lock), 每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生衝突,上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...

mysql鎖機制總結 mysql鎖機制總結

1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...