mysql悲观锁测试_测试一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值