2019獨角獸企業重金招聘Python工程師標準>>>
聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。
mysql鎖機制分為表級鎖和行級鎖 myISAM 引擎不支持事物!
排他鎖:
Set Autocommit=0; // 把事物設置成手動事物!
排他鎖又稱為寫鎖,簡稱X鎖 排他鎖就是不能與其他鎖并存,如A事務獲取了一行數據的排他鎖,事務就不能再獲取該行的其他鎖 必須等A事物的排他鎖結束才能對一行數據進行增刪改! mysql InnoDB引擎默認的修改數據語句,update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型,如果加排他鎖可以使用select ...for update語句
實驗1:
下圖兩個用戶都設置了手動事物 實驗證明 A 把數據刪了 B還能查到 B也要進行commit 提交或者roll回滾才能看到修改后的數據!
實驗2:
A事物還在執行 B事就對這行數據進行操作 B事物卡住在這里!
實驗3:
A把sid=1的數據改成了2
然后b要把sid的數據改成5 結果失敗了 原因是已經沒有sid=1 這條數據了
早就被A修改成2了
如果B的條件是 把sid=2的數據修改成5 那就能操作成功了!
實驗4:
A把查詢出來的數據加上排他鎖
B也對這條數據去加排他鎖
然后卡住了
要等A執行commit提交 A的排他鎖才能結束!
下圖用工具測試:
排他鎖 A用戶已經把這個表用排他鎖鎖住了
B用戶去修改數據 然后卡在這里
要等A用戶執行Commit 提交 B用戶才能執行
再看看下圖 結果是10
因為A用戶把sid改成10
B用戶的條件是sid=1
沒有此條數據 所以修改不上!
共享鎖:
Lock in share mode
第一 共享鎖不能與排他鎖共存在!
第二 共享鎖在自動事物的情況下不會發生沖突
第三 共享鎖在手動事物的情況下會出現一系列問題!
第四 共享鎖可以多個用戶對同一條記錄鎖定!
實驗1:
在手動事物的情況下 A先對這一行數據進行了排他鎖 然后B用戶又去對這行數據進行共享鎖 死活不給B用戶操作 要等A用戶把這個事物處理完才能給B用戶進行排他鎖! 反之結果還是一樣 排他鎖和共享鎖不能共存!
實驗2:
在手動事物下 A和B 都對這一條數據加上共享鎖了 然后A事務要修改 會處于等待狀態 他在等B用戶來操作 只要B一來操作 系統就會把B用戶掐死掉 先來的成功執行 后來的直接被干掉
實驗3:
A用戶對sid=1記錄共享鎖鎖定
B用戶對Sid=2記錄共享鎖鎖定
然后A用戶去修改sid=2的記錄 卡住在那里
等B來操作 B一來操作 B就完蛋了!
這個故事告訴我們 被干掉總是B用戶!
Sqlyog實驗
雙方各鎖了一條數據
A對B鎖定的數據進行更改
A處于等待
B對A的數據進行改變
B用戶的鎖干掉了
最后兩個人都把事物提交或者回滾
就能查詢出真實數據了!
后執行的遭殃 直接被干掉了!