鎖
全局鎖
全局鎖對整個數據庫實例加鎖,加鎖後的數據庫只能讀,後面的 DML、DDL 語句的事務提交都被阻塞。典型場景是做全庫的邏輯備份,對所有表進行鎖定,獲取一致性視圖,保證數據完整性。
數據庫加全局鎖是一個重操作,存在以下問題:
- 如果在主庫做備份,在備份期間都不能執行更新,業務停擺
- 如果在從庫做備份,那麼備份期間從庫不能執行主庫同步過來的二進制日誌(binlog),導致主從延遲
- 在 InnoDB 引擎中,我們可以在備份操作加上參數 --single-transaction 來完成不加鎖的一致性數據備份
flush tables with read lock;
mysqldump -uroot -p1234 itcat > itcat.sql;
unlock tables;
表級鎖
表鎖
每次操作鎖住整張表,鎖顆粒大,發生鎖衝突機率高,併發最低,應用在 MyISAM、InnoDB、BDB存儲引擎中。
表級鎖: 表鎖:表共享讀鎖,表獨佔寫鎖;加鎖 lock tables 表名... read / write,釋放鎖 unlock tables / 客戶端斷開連結 元數據鎖 意向鎖
元數據鎖(meta data lock)
MDL 加鎖過程是系統自動控制,無需顯示使用,在訪問一張表的時候自動加上。MDL 鎖主要作用是維護表元數據的數據一致性,在表上有活動事務的時候,不可以對元數據結構進行修改操作。(避免 DML 與 DDL衝突,保證讀寫的正確性,對一張表進行增刪改查對時候,加 MDL 讀鎖;當對表結構進行變更操作的時候,加 MDL 寫鎖)
增刪改查操作與修改表操作是互斥
#查看元數據鎖
select objecy_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
意向鎖
為了避免 DML 執行時,加的行鎖與表鎖衝突,在 InnoDB 中引入意向鎖,使得表鎖不用加查每行數據是否加鎖,減少表鎖的檢查。
意向共享鎖(IS):與表鎖共享鎖(read)兼容,與表鎖排他鎖(write)互斥 意向排他鎖(IX):與表鎖共享鎖(read)兼容及排他鎖(write)都互斥。意向鎖之間不會互斥
#查看意向鎖及行鎖的加鎖情況
select object_schema, object_name, index_name, lock_type, lock_mode, lock_data, from performance_schema.data_locks;
行級鎖
每次操作鎖住對應的行數據,鎖粒度小,發生鎖衝突機率最小,併發度最高,應用在 InnoDB 引擎中,行鎖匙通過索引上加鎖來實現
行鎖:鎖定單行數據,防止其他事物進行 update 和 delete,事務級別 RC,RR 支持 間隙鎖:鎖定索引記錄間隙(不含記錄),確保索引記錄間隙不變,防止其他事務在這個間隙進行 insert,防止幻讀,事務級別 RR 臨鍵鎖:行鎖和間隙鎖的組合,同時鎖住數據,並鎖住前面的間隙,事務級別 RR 支持