-- 1、關閉自動提交 SET AUTOCOMMIT = 0 ; -- 2、查詢id=1,OK SELECT * FROM dc_user_in01 WHERE id=1 ; -- 3、添加寫鎖失敗 SELECT * FROM dc_user_in01 WHERE id=1 FOR UPDATE ; -- 4、恢復事務提交 SET AUTOCOMMIT = 1 ; 會話窗口二
-- 1、關閉自動提交 SET AUTOCOMMIT = 0 ; -- 2、查詢id=2,OK SELECT * FROM dc_user_in01 WHERE id=2 ; -- 3、寫入失敗(等待) INSERT INTO dc_user_in01 (id,user_name,tell_phone) VALUES (3,'lock01','13267788998'); -- 4、寫鎖失敗(等待) SELECT * FROM dc_user_in01 WHERE id=2 FOR UPDATE ; -- 5、恢復事務提交 SET AUTOCOMMIT=1 ;
會話窗口一
-- 1、關閉自動提交 SET AUTOCOMMIT = 0 ; -- 2、查詢id=1,OK SELECT * FROM dc_user_in02 WHERE id=1 ; -- 3、添加寫鎖成功 SELECT * FROM dc_user_in02 WHERE id=1 FOR UPDATE ; -- 執行到這里,再執行窗口2 -- 4、恢復事務提交 SET AUTOCOMMIT = 1 ; 會話窗口二
-- 1、關閉自動提交 SET AUTOCOMMIT = 0 ; -- 2、查詢id=2,OK SELECT * FROM dc_user_in02 WHERE id=2 ; -- 3、查詢id=1,OK,加讀鎖 SELECT * FROM dc_user_in02 WHERE id=1 ; -- 4、寫入成功 INSERT INTO dc_user_in02 (user_name,tell_phone) VALUES ('lock01','13267788998'); -- 5、加寫鎖成功,id為2的 SELECT * FROM dc_user_in02 WHERE id=2 FOR UPDATE ; -- 6、加寫鎖失敗(等待),占用id為1的 SELECT * FROM dc_user_in02 WHERE id=1 FOR UPDATE ; -- 7、恢復事務提交 SET AUTOCOMMIT=1 ; 索引失效問題 這里要注意索引是否被使用問題,在很多查詢中,可能因為種種原因導致索引不執行。
explain SELECT * FROM dc_user_in02 WHERE id=1 ; 查詢鎖爭用 show status like 'innodb_row_lock%'; Innodb_row_lock_waits和Innodb_row_lock_time_avg的值越大,鎖爭用情況越嚴重,效率則越低下。
-- 1、開啟事務 START TRANSACTION ; -- 3、占用id=6的資源 SELECT * FROM dc_gap WHERE id=6 FOR UPDATE ; -- 5、占用id=9的資源等待 SELECT * FROM dc_gap WHERE id=9 FOR UPDATE ; 會話窗口二
-- 2、開啟事務 START TRANSACTION ; -- 4、占用id=9的資源 SELECT * FROM dc_gap WHERE id=9 FOR UPDATE ; -- 6、占用id=6的資源拋死鎖 SELECT * FROM dc_gap WHERE id=6 FOR UPDATE ; 補刀一句:數據庫實現各種死鎖檢測機制,或者死鎖超時等待結束,InnoDB存儲引擎在檢測到死鎖后,會立即返回錯誤,不然兩個事務會隔空對望,一眼萬年。