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