MySQL InnoDB儲存引擎 之 鎖

2021-08-28 22:00:45 字數 2593 閱讀 1264

mysql innodb儲存引擎有七種鎖

1. 自增鎖(auto-inc locks)

1.1 自增實現

在innodb儲存引擎記憶體結構中,對每個含有自增值的表都有乙個自增長計數器,當對其進行插入操作時,計數器會被初始化,執行如下語句得到計數器值:

select max(auto_inc_col) from t for update;
可以看到該sql語句後面加了排它鎖(for update),為了提高插入效能,這個鎖不是在事務完成後才釋放,而是完成對自增長值插入的sql語句後就立即釋放。

上面的方式稱為傳統的auto-inc locking方式,它其實採用的是一種特殊的表鎖機制,所以對於大量的資料的併發插入還是會有效能問題,試想乙個事務執行insert…select的大量資料插入,另外乙個事務的插入會被阻塞。

1.2 innodb_autoinc_lock_mode引數

從mysql5.1.22版本開始,innodb儲存引擎提供了乙個引數innodb_autoinc_lock_mode,預設值為1。討論該值的意義前,先對自增插入進行分類:

了解上面四種插入型別後,現在討論innodb_autoinc_lock_mode引數的值的情況:

ps: myisam引擎的自增長是表鎖;innodb引擎下,自增列必須是索引,並且是索引第一列。

2. 共享/排他鎖(shared and exclusive locks)

共享鎖(share locks,記為s鎖): 讀取資料時加s鎖

排他鎖(exclusive locks,記為x鎖): 修改資料時加x鎖

s         x

s 相容 互斥

x 互斥 互斥

即:

(1)多個事務可以拿到一把s鎖,讀讀可以並行;

(2)而只有乙個事務可以拿到x鎖,寫寫/讀寫必須互斥;

innodb支援多粒度鎖(multiple granularity locking),它允許行級鎖與表級鎖共存,實際應用中,innodb使用的是意向鎖。

意向鎖是指,未來的某個時刻,事務可能要加共享/排它鎖了,先提前宣告乙個意向。

3. 意向鎖(intention locks)

意向鎖有這樣一些特點:

(1)首先,意向鎖,是乙個表級別的鎖(table-level locking);

(2)意向鎖分為:

意向鎖協議(intention locking protocol)並不複雜:

事務要獲得某些行的s鎖,必須先獲得表的is鎖

事務要獲得某些行的x鎖,必須先獲得表的ix鎖

舉個例子:

select ... lock in share mode,要設定is鎖;

select ... for update,要設定ix鎖;

插入意向鎖(insert intention locks)

對已有資料行的修改與刪除,必須加強互斥鎖x鎖,那對於資料的插入,使用插入意向鎖。

插入意向鎖,是間隙鎖(gap locks)的一種,專門針對insert操作的。多個事務,在同乙個索引,同乙個範圍區間插入記錄時,如果插入的位置不衝突,不會阻塞彼此。

— 鎖演算法 —

5. 記錄鎖(record locks)

記錄鎖,它封鎖索引記錄,例如:

select * from t where id=1 for update;
它會在id=1的索引記錄上加鎖,以阻止其他事務插入,更新,刪除id=1的這一行

需要說明的是:

select * from t where id=1;
則是快照讀(snapshot read),它並不加鎖。

6. 間隙鎖(gap locks)

間隙鎖,它封鎖索引記錄中的間隔,或者第一條索引記錄之前的範圍,又或者最後一條索引記錄之後的範圍。

select * from t where id between 8 and 15 for update;
會封鎖區間[8,15],以阻止其他事務把id=10的記錄插入。

間隙鎖的主要目的,就是為了防止其他事務在間隔中插入資料,以導致「不可重複讀」。如果把事務的隔離級別降級為讀提交(read committed, rc)及以下,間隙鎖則會自動失效。

7. 臨鍵鎖(next-key locks)

臨鍵鎖,是記錄鎖與間隙鎖的組合,它的封鎖範圍,既包含索引記錄,又包含索引區間。

更具體的,臨鍵鎖會封鎖索引記錄本身,以及索引記錄之前的區間。

臨鍵鎖的主要目的,是為了避免幻讀(phantom read)。如果把事務的隔離級別降級read committed及以下,臨鍵鎖則也會失效。

ps:

參考:《mysql技術內幕:innodb儲存引擎》

關於mysql核心,一定要知道的!

mysql InnoDB儲存引擎

innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...

Mysql Innodb儲存引擎

鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...

MYSQL INNODB 儲存引擎

innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...