-- 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存储引擎在检测到死锁后,会立即返回错误,不然两个事务会隔空对望,一眼万年。