Mysql 鎖機制原理 應用 調優

2021-10-24 04:55:51 字數 3114 閱讀 2972

共享鎖

一般來說是就是多個會話可以共同去持有鎖,不會發生互斥,如果沒有排他鎖的情況下,共享鎖也可以是無鎖的狀態,但是不能直接設計成無鎖,因為共享鎖需要跟排他鎖發生排斥

獨佔鎖

排他鎖就是不能與其他所並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對資料就行讀取和修改

行鎖

觸發

innnodb事務中會

update where id或者select where id for update會觸發行鎖,這是獨佔鎖

阻塞

沒commit時,另外的會話讀寫都會被阻塞;

ps: 為了演示,關閉自動提交事務,set autocommit = 0; (set autocommit = 0;這就表示除非顯式地開始乙個事務,否則每個查詢都被當做乙個單獨的事務自動執行)

公升級

如果update語句不是使用索引,那麼行鎖自動公升級為表鎖;

表鎖

加鎖指令:lock sp_ordel_tbl mylock read/write (lock [表名] [鎖變數名] [鎖型別])

解鎖指令:unlock sp_ordel_tbl

讀鎖:加了讀鎖的表,別的事務過來,讀可以併發,寫會被阻塞;自己也不能改自己

寫鎖:加了寫鎖的表,別的事務過來,讀和寫都會被阻塞;自己就完全不會

債務鎖:發起鎖的會話,不可以查別人、不可以改別人,必須解鎖後才能操作其他表

效能對比

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低、

行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高

意向鎖

會話a獲得了該錶的寫鎖,理論上可以修改任意行;但是行鎖中,這是不允許的!

表鎖如果每個都要判斷遍歷是否將了行鎖效能低,

任意意一行如果進行了行鎖都會標記在意向共享鎖+1表鎖申請寫鎖時會被阻塞;等到行鎖解除後才能

間隙鎖

利用範圍條件會鎖定這個範圍內所有鍵,即使這個鍵不存在,寧可殺錯也不放過;以防止幻讀的產生,所以在事務中update乙個範圍索引則會使用這個

語句相互等待

事務a執行a1的時候被事務b的鎖阻塞

事務b執行b1的時候被事務a的鎖阻塞

ps:獨佔鎖情況下,不同行資料的事務操作,發生了相互等待發生死鎖

間隙鎖衝突

innodb在rr級別下,如下的情況也會產生死鎖,鎖住了一堆鍵,但是某個個事務的插入操作被阻塞了

不同索引鎖衝突

事務a在執行時,除了在二級索引加鎖外,還會在聚簇索引上加鎖,在聚簇索引上加鎖的順序是[1,4,2,3,5],而事務b執行時,只在聚簇索引上加鎖,加鎖順序是[1,2,3,4,5],這樣就造成了死鎖的可能性

突發情況解決

所有指令

檢視鎖表:show open tables where in_use > 0;

檢視執行緒:show processlist

檢視鎖競爭統計:show status like 『innodb_row_lock%』 – 檢查innodb_row_lock狀態變數來分析系統上的行鎖的爭奪情況

檢視所有事務:select * from information_schema.innodb_trx;

檢視當前鎖定的事務:select * from information_schema.innodb_locks;

檢視等鎖的事務:select * from information_schema.innodb_lock_waits;

解鎖步驟

show open tables where in_use > 0;

show processlist;

kill 8

全域性引數調優

鎖超時時間配置檢視

show global variables like 『innodb_lock_wait_timeout』;(全域性)

show variables like 『innodb_lock_wait_timeout』;

鎖超時時間配置設定

set global innodb_lock_wait_timeout=100; (全域性)

set variables like 『innodb_lock_wait_timeout』;

寫鎖最大競爭數量:

max_write_lock_count

減少寫的優先順序

setlow_priority_updates=1(通過指定insert、update、delete語句的low_priority屬性,降低該語句的優先順序。)

wait-for graph演算法來主動進行死鎖檢測;mysql的死鎖檢測到之後,會選擇乙個事務進行回滾。而選擇的依據:看哪個事務的權重最小,事務權重的計算方法:事務加的鎖最少;事務寫的日誌最少;事務開啟的時間最晚。實驗1,事務2寫了日誌,事務1沒有,回滾事務1。實驗2,都沒寫日誌,但是事務1開始的早,回滾事務2。

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...

大廠必考 mysql鎖機制及原理

參考 鎖是資料庫系統區別於檔案系統的乙個關鍵特性。鎖機制用於管理對共享資源的併發訪問,並確保資料的完整性和一致性,實現事務的隔離性要求。innodb實現了兩種標準的行級鎖 共享鎖 s lock 允許事務讀一行資料。語法為 select from table lock in share mode。排他...