mysql中存儲引擎爲Innodb的鎖介紹

mysql中存儲引擎爲Innodb的鎖介紹

一、簡介

在mysql中,有各種鎖,在這裏主要對存儲引擎爲Innodb的常用的鎖進行介紹。

二、Innodb引擎鎖知識點

2.1 鎖的粒度

鎖的粒度有行鎖(鎖加在行上)和表鎖(鎖加在表上),Innodb的鎖默認是行鎖(也支持表鎖),需要注意的是,行鎖(與oracle不同,oracle的鎖是加在數據塊上的數據行上)是加在索引上的,也就是說,只有通過索引檢索數據,纔會使用行鎖,否則,將使用表鎖。

2.2 鎖的事務隔離級別

鎖的事務有四個隔離級別:

  • 未提交讀(read uncommited、髒讀)
  • 已提交讀(read commited、不可重複讀)
  • 可重複讀(repeatable read、幻讀)
  • 可串行化(serializable)

其中mysql默認事務隔離級別是可重複讀,對於該級別出來的幻讀,mysql是通過多版本併發控制(mvcc,multiversion concurrency control)處理的。

2.3 innodb鎖的類型

行級鎖分爲共享鎖(S鎖)、排他鎖(X鎖)。

爲了行鎖和表鎖共存,實現更細粒度控制的表鎖分爲意向共享鎖(IS鎖,表鎖)、意向排它鎖(IX鎖,表鎖),

注意意向鎖是Innodb自動加的,對於update、delete、insert,Innodb會自動加排他鎖,對於select不會加鎖。

  • 共享鎖(S鎖):允許獲得鎖的事務讀某行,阻止其它事務獲取相同行的排它鎖。

  • 排他鎖(X鎖):允許獲取鎖的事務更新數據,阻止其它事務獲取相同行的共享鎖和排它鎖。

  • 意向共享鎖(IS鎖):事務在打算給數據加共享鎖前,必須獲得該表的意向共享鎖。

  • 意向排它鎖(IX鎖):事務在打算給數據加排它鎖前,必須獲得該表的意向排它鎖。

2.4 間隙鎖(next-key)鎖

正常加鎖時,除檢索範圍內的已存在數據行的索引會被加鎖,在檢索範圍內,但不存的數據行,這部分叫做間隙,innodb也會對這個間隙加鎖,即是間隙鎖。也就是說在檢索範圍內,不管真實是否有數據行,都會被鎖住。

三、Innodb引擎鎖操作及示例

3.1 查看事務提交模式

mysql的事務默認是自動提交(autocommmit)的,查看用:

show variables like 'AUTOCOMMIT';

1或ON表示啓用,0或OFF表示禁用。當爲0或OFF時,所有查詢在一個事務內,直到顯式執行commit提交或rollback回滾操作。
修改用:

set AUTOCOMMIT=0;

3.2 顯示加共享鎖

如:

select * from stu lock in share mode;

3.3 顯示加排他鎖

如:

select * from stu for update;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章