创建一个存储过程 在存储过程中 先查询 一个表 for update
见代码:
DELIMITER $$
DROP PROCEDURE IF EXISTS test_sp1 $$
CREATE PROCEDURE test_sp1( )
BEGIN
DECLARE t_error INTEGER DEFAULT 0;
DECLARE COUNT INT DEFAULT 0;
DECLARE SUM INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;
SELECT * FROM srv_my_service WHERE id =1 FOR UPDATE;
WHILE COUNT < 100000000 DO
SET SUM = SUM + COUNT;
SET COUNT = COUNT + 1;
END WHILE;
SELECT SUM;
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
SELECT t_error;
END$$
新打开一个窗口 ,执行查询
SELECT * FROM srv_my_service WHERE id =1 FOR UPDATE;
执行此语句,将一直处于等待状态
原因是上一存储过程先执行查询 使用for update 占用X锁,在事务没有提交的情况下,新的窗口使用 for update 查询则一个处于阻塞等待
因为上一存储过程一直没有释放X锁.
执行下面的语句,可以正常执行.
SELECT * FROM srv_my_service WHERE id =2 FOR UPDATE;
说明mysql 此时使用行锁,
执行下面的语句
SELECT * FROM srv_my_service FOR UPDATE;
任然阻塞等待
同理,执行如下语句仍然的带上面的结果
UPDATE srv_my_service SET srv_no ='323345454523434' WHERE id = 2
UPDATE srv_my_service SET srv_no ='323345454523434'
UPDATE srv_my_service SET srv_no ='323345454523434' WHERE id = 1