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;