zoukankan      html  css  js  c++  java
  • 测试一个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
    

      

  • 相关阅读:
    ioctl函数用法小记
    scanf函数用法小记
    printf函数用法小记
    REDIS
    lspci 虚拟机网卡对应关系
    vmware安装ubuntu " Intel VT-x 处于禁用状态"
    win10远程桌面配置
    Win10如何彻底禁用小娜?彻底禁用小娜的方法
    为什么Windows7打开项目的方式是灰的不能修改
    以下suse11.3x64可以安装pycrypto-2.6.1
  • 原文地址:https://www.cnblogs.com/niceletter/p/11017996.html
Copyright © 2011-2022 走看看