分類
- 全局鎖
- 表級鎖
- 行級鎖
全局鎖
做全庫的邏輯備份
flush tables with read lock;
unlock tables;
在InnoDB引擎中,我們可以在備份時加上參數–single-transaction參數來完成不加鎖的一致性數據備份
mysqldump --single-transaction -uroot -p123456 itcast>itcast.sql
表級鎖
表鎖
-
表共享讀鎖(read lock)
-
表獨占寫鎖(write lock)
-- 加鎖
lock tables 表名... read/write
-- 釋放鎖
unlock tables
元數據鎖(meta data lock,MDL)
MDL加鎖過程是系統自動控制,無需顯示使用。MDL鎖主要作用是維護表元數據的數據一致性,在表上有活動事務時,不可以對原數據進行寫入操作。為了避免DML與DDL沖突,保證讀寫的正確性。
意向鎖
避免DML在執行時,加的行鎖與表鎖的沖突,在InnoDB中引入了意向鎖,使得表鎖不用檢查每行數據是否加鎖,使用意向鎖來減少表鎖的檢查。
- 意向共享鎖(IS):由語句select … lock in share mode 添加。與表鎖共享鎖(read)兼容,與表鎖排它鎖(write)互斥
- 意向排他鎖(IX):與表鎖共享鎖(read)及排他鎖(write)都互斥。意向鎖之間不會互斥。
行級鎖
鎖住對應的行數據,InnoDB的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對記錄加的鎖
InnoDB有行級鎖,而MyIsam沒有
- 行鎖:鎖定單個行記錄的鎖,防止其他事務對此進行update和delete。在RC,RR隔離級別下都支持
- 間隙鎖:鎖定索引記錄間隙,確保索引記錄間隙不變,防止其他事務在這個間隙進行insert,產生幻讀。在RR隔離級別下都支持
- 臨鍵鎖:行鎖和間隙鎖組合,同時鎖住數據,并鎖住數據前面的間隙Gap。在PR隔離級別下支持。
行鎖
- 共享鎖
- 排他鎖
InnoDB的行鎖是針對與索引加的鎖,不通過索引條件檢索數據,那么InnoDB將對表中的所有記錄加鎖,此時就會升級為表鎖
間隙鎖/臨建鎖
間隙鎖可以共存,一個事務采用的間隙鎖不會阻止另一個事務在同一個間隙上采用間隙鎖。
- 索引上的等值查詢(唯一索引),給不存在的記錄加鎖時,優化為間隙鎖
- 索引上的等值查詢(普通索引),向右遍歷時最后一個值不滿足查詢時,退化為間隙鎖
- 索引上的范圍查詢(唯一索引),回訪問到不滿足條件的第一個值為止。