文章目錄
- 1、介紹
- 2、查看意向鎖及行鎖的加鎖情況
- 3、行鎖的演示
- 3.1、普通的select語句,執行時,不會加鎖
- 3.2、select * from stu where id =1 lock in share mode;
- 3.3、共享鎖與共享鎖之間兼容。
- 3.4、共享鎖與排他鎖之間互斥。
- 3.5、排它鎖與排他鎖之間互斥
- 3.6、無索引行鎖升級為表鎖
- 4、間隙鎖&臨鍵鎖的演示
- 4.1、索引上的等值查詢(唯一索引),給不存在的記錄加鎖時, 優化為間隙鎖
- 4.2、索引上的等值查詢(非唯一普通索引),向右遍歷時最后一個值不滿足查詢需求時,next-keylock 退化為間隙鎖
- 4.3、 索引上的范圍查詢(唯一索引)--會訪問到不滿足條件的第一個值為止
1、介紹
行級鎖,每次操作鎖住對應的行數據。鎖定粒度最小
,發生鎖沖突的概率最低,并發度最高
。應用在InnoDB存儲引擎中。
InnoDB的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對記錄加的鎖。對于行級鎖,主要分為以下三類
:
行鎖(Record Lock)
:鎖定單個行記錄的鎖,防止其他事務對此行進行update
和delete
。在RC、RR隔離級別下都支持。
間隙鎖(Gap Lock)
:鎖定索引記錄間隙(不含該記錄),確保索引記錄間隙不變,防止其他事務在這個間隙進行insert
,產生幻讀。在RR隔離級別下都支持。
臨鍵鎖(Next-Key Lock)
:行鎖
和間隙鎖
組合,同時鎖住數據,并鎖住數據前面的間隙Gap。在RR隔離級別下支持。
2、查看意向鎖及行鎖的加鎖情況
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
3、行鎖的演示
3.1、普通的select語句,執行時,不會加鎖
3.2、select * from stu where id =1 lock in share mode;
3.3、共享鎖與共享鎖之間兼容。
3.4、共享鎖與排他鎖之間互斥。
3.5、排它鎖與排他鎖之間互斥
3.6、無索引行鎖升級為表鎖