1. 程式人生 > >一分鐘理清Mysql的鎖型別——《深究Mysql鎖》

一分鐘理清Mysql的鎖型別——《深究Mysql鎖》

延伸閱讀

我們常用的儲存引擎就MyISAM和InnoDB。MyISAM儲存主要就簡單的表級別鎖,下面只說InnoDB的各種鎖型別。

InnoDB不僅支援行級別的鎖,也支援表級別的鎖。平常我們會聽到各種鎖,你是不是不僅迷茫它們怎麼用的,還會迷茫它們 各自之間都是什麼關係?

什麼是樂觀鎖和悲觀鎖?

樂觀鎖和悲觀鎖是泛指,不是具體的鎖。

樂悲鎖:也叫樂觀併發控制,它總是樂觀的認為使用者在併發事務處理時不會影響彼此的資料。

多版本併發控制個人認為就是一種樂觀鎖,具體參考:《Mysql概要》 裡的MVCC。所以樂觀鎖我們自己也可以很輕鬆的實現,主要是在有中加一個version欄位作為版本號。

 悲鎖觀鎖:悲觀鎖會悲觀的認為每次去拿的資料都會被別人修改。所以每次在拿資料的時候都會上鎖,從而遮蔽可能違反資料完整性的操作。間隙鎖、臨鍵鎖都屬於悲觀鎖。

什是表鎖和行鎖?

 表鎖和行鎖也是泛指,不是具體的鎖。

表級鎖有:意向共享鎖、意向排他鎖、自增鎖等。InnoDB的行鎖都是實現在索引上的

行級鎖有:共享鎖、排他鎖、記錄鎖

什麼是共享鎖(S鎖)和排他鎖(X鎖)?

InnoDB引擎實現了標準的行級別鎖,分別是共享鎖和排他鎖。

  • 拿共享鎖是為了讓當前事務去讀一行資料。
  • 拿排他鎖是為了讓當前事務去修改或刪除某一行資料。

一個事務拿到了當前資料行的共享鎖,另一個事務也能馬上拿到當前資料行的共享鎖。

一個事務拿到了當前資料行的排他鎖,則另一個事務不能立馬拿到當前資料行的排他鎖,因為它會被阻塞直到前一個事務釋放。

設定共享鎖:select * from user where id = 1 LOCK IN SHARE MODE;

設定排他鎖:select * from user where id = 1 FOR UPDATE;

InnoDB到底有幾種鎖?

(1) 共享/排它鎖(Shared and Exclusive Locks)

(2) 意向鎖(Intention Locks)

(3) 記錄鎖(Record Locks)

(4) 間隙鎖(Gap Locks)

(5) 臨鍵鎖(Next-key Locks)

(6) 插入意向鎖(Insert Intention Locks)

(7) 自增鎖(Auto-inc Locks)

臨鍵鎖是記錄鎖和間隙鎖的組合。