mysql之InnoDB引擎下各種鎖機制筆記

2021-10-21 14:51:38 字數 2276 閱讀 5059

鎖是資料庫區別於檔案系統的乙個關鍵特性。鎖機制用於管理對共享資源的併發訪問。

1.latch一般稱為閂(shuan)鎖(輕量級的鎖),在innodb儲存引擎中,latch又可以分為mutex(互斥量)和rwlock(讀寫鎖)。其目的是保證併發執行緒操作臨界資源的正確性,並且通常沒有檢測死鎖的機制。

2.lock的物件是事務,用來鎖定資料庫中的物件,如表、頁、行。並且在事務commit或rollback後進行釋放,有死鎖機制。

檢視latch   命令show engine  innodb mutex

檢視lock 命令show engine innodb status

兩種標準的行級鎖

1)共享鎖(s lock),允許事務讀一行資料。

2)排他鎖(x lock), 允許事務刪除或更新一行資料。

假如乙個事務t1已經獲得了行r的共享鎖,那麼事務t2、t3等事務都可以立即獲得行r的共享鎖,因為讀取並沒有改變行r的資料,這種情況為鎖相容。但如果事務t3想要獲取行r的排他鎖,則必須等待t1、t2釋放行r上的共享鎖,這種情況為鎖不相容。

注意行鎖是針對同一行資料。

3)多粒度鎖

這種鎖定允許事務在行級上的鎖和表級上的鎖同時存在。

4)意向鎖

意向鎖是將鎖定的物件分為多個層次,簡單說就是我們可以根據自己的意願在各個層次加鎖操作,實現了不同粒度上進行加鎖操作。如果需要對某頁上的的記錄r進行上x鎖,那麼分別需要對其所屬資料庫a、表、頁上加意向鎖ix,最後對記錄r上x鎖。其中任何一部分導致等待,那麼該操作需要等待粗粒度鎖完成。如圖6-3所示。

innodb支援兩種意向鎖:

1)意向共享鎖(is lock),事務想要獲得一張表中某幾行的共享鎖

2)意向排他鎖(ix lock),事務想要獲得一張表中某幾行的排他鎖

1)innodb_trx    可以清楚的看到當前事務資訊。
2)innodb_locks 可以清楚看到當前鎖的資訊。

3)innodb_lock_waits 可以清楚看到哪個事務阻塞了另乙個事務。

另外可以將三張表進行乙個聯合查詢,可以更直觀的看到詳細資訊。
一致性的非鎖定讀是指innodb通過行多版本併發控制的方式來讀取當前執行時間資料庫中行的資料。如果我們讀取的行正在執行delete或update,這時候讀取操作不會等待行鎖的釋放,而是去讀取行的乙個快照資訊。該機制極大的提高了資料庫的併發性。

快照資料可能有多個版本,由此帶來的併發控制稱之為多版本併發控制(multi version concurrency control,mvcc)。

在事務隔離級別read committed(讀已提交)和repeatable read(innodb預設的事務隔離級別,重複讀)下使用非鎖定的一致性讀。在read committed事務隔離級別下,非一致性讀總是讀取被鎖定行的最新乙份快照資料。而在repeatable read事務隔離級別下非一致性讀總是讀取事務開始時的行資料版本。

在預設配置情況下,innodb的select操作使用的是一致性非鎖定讀,如果在某些情況下我們想要使用對資料庫讀取操作進行加鎖保證資料邏輯的一致性,就需要支援加鎖語句,innodb對select語句支援了兩種一致性的鎖定讀操作:

1)select … for update 對讀取 的行加乙個x鎖

2)select … lock in share mode 對讀取的行加乙個s鎖

對於一致性非鎖定讀,即使讀取的行執行了select … for update也是可以進行讀取的。

5.自增長與鎖

自增長在資料庫中是非常常見的一種屬性,在innodb儲存引擎記憶體結構中,對每個含有自增長值得表都有乙個自增長計數器。當對這個表插入資料時,這個計數器就會被初始化,插入操作會依據自增長的計數器值+1。這個實現方式稱為auto-inc locking。這種鎖在完成插入的sql語句後會立即釋放。

從mysql5.1.22版本開始,innodb提供了乙個引數innodb_autoinc_lock_mode來控制自增長的模式,其預設值為1。自增長的插入分類和各引數下對不同的插入分類影響如下圖:

在innodb中,自增長列必須是索引,同時必須是索引的第乙個列 。

MySQL儲存引擎 InnoDB

為什麼innodb不將總數存起來?innodb直接count 會遍歷全表 沒有where條件 雖然結果準確,但會導致效能問題。按照效率排序的話,count 字段 innodb一棵b 樹可以存放多少行資料?這個問題的簡單回答是 約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先...

MySQL的儲存引擎INNODB

1 一般情況下,mysql會預設提供多種儲存引擎,你可以通過下面的檢視 看你的mysql現在已提供什麼儲存引擎 mysql show engines 看你的mysql當前預設的儲存引擎 mysql show variables like storage engine 你要看某個錶用了什麼引擎 在顯示...

MySql中InnoDB引擎索引

mysql中innodb引擎的索引分兩類,一類是一級索引 主鍵的同義詞 一類是二級索引 非主鍵的索引 兩類索引都使用b tree形式組織,但一級索引的葉子節點包含所以對應的整行資訊,所有的查詢最終都是通過一級索引完成,二級索引只包含二級索引對應的一級索引。所以直接使用一級索引比用二級索引快,因為少了...