测试一个mysql 悲观锁

创建一个存储过程 在存储过程中  先查询  一个表  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

  

原文地址:https://www.cnblogs.com/niceletter/p/11017996.html