表鎖innodb 鎖關係矩陣
innodb死鎖問題排查思路
innodb 加鎖行為驗證
搞定mysql
帶你搞定mysql實戰,輕鬆對應海量業務處理及高併發需求,從容應對大場面試
mysql - 解讀mysql事務與鎖機制
mysql - 共享鎖和排它鎖初探
mysql - 無索引行鎖公升級為表鎖
mysql - 鎖等待及死鎖初探
在 mysql 中有三種級別的鎖:頁級鎖、表級鎖、行級鎖
三種級別的鎖分別對應儲存引擎關係如上圖。
note:mysql 中的表鎖包括讀鎖和寫鎖
在 mysql innodb 儲存引擎中,鎖分為行鎖和表鎖。
其中行鎖包括兩種鎖
innodb 行鎖是通過對索引資料頁上的記錄(record)加鎖實現的。主要實現演算法有 3 種:record lock、gap lock 和 next-key lock。
另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,innodb 還有兩種內部使用的意向鎖(intention locks),這兩種意向鎖都是表鎖。
表鎖又分為三種
在加行鎖之前必須先獲得表級意向鎖,否則等待 innodb_lock_wait_timeout 超時後根據innodb_rollback_on_timeout 決定是否回滾事務。
在 mysql innodb 儲存引擎中,我們在設計表結構的時候,通常會建議新增一列作為自增主鍵。
這裡就會涉及乙個特殊的鎖:自增鎖(即:auto-inc locks),它屬於表鎖的一種,在 insert 結束後立即釋放。
我們可以執行show engine innodb status\g
來檢視自增鎖的狀態資訊。
在自增鎖的使用過程中,有乙個核心引數,需要關注,即innodb_autoinc_lock_mode
,它有0、1、2 三個值。保持預設值即可。
+ 表示相容,- 表示不相容
在 mysql 中死鎖不會發生在 myisam 儲存引擎中,但會發生在 innodb 儲存引擎中,因為 innodb 是逐行加鎖的,極容易產生死鎖。那麼死鎖產生的四個條件是什麼呢?
在發生死鎖時,innodb 儲存引擎會自動檢測,並且會自動回滾代價較小的事務來解決死鎖問題。但很多時候一旦發生死鎖,innodb 儲存引擎的處理的效率是很低下的或者有時候根本解決不了問題,需要人為手動去解決。
排查 innodb 鎖問題通常有 2 種方法。
【基於資源爭用導致死鎖的情況】
session1 首先拿到 id=1 的鎖,session2 同期拿到了 id=5 的鎖後,兩者分別想拿到對方持有的鎖,於是產生死鎖。
【metadata lock(即元資料鎖)導致的死鎖的情況】
session1 和 session2 都在搶占 id=1 和 id=6 的元資料的資源,產生死鎖。
檢視 mysql 資料庫中死鎖的相關資訊,可以執行show engine innodb status\g
來進行檢視,重點關注 「latest detected deadlock」 部分。
下面舉一些例子分析 innodb 不同索引的加鎖行為。分析鎖時需要跟隔離級別聯絡起來,我們以 rr 為例,主要是從四個場景分析。
假設條件是:
加鎖行為:僅在 id=10 的主鍵索引記錄上加 x鎖。
假設條件是:
加鎖行為:
假設條件是:
加鎖行為:
假設條件是:
加鎖行為:
表裡所有行和間隙均加 x 鎖。
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 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...