mysql 行锁定、存储过程

mysql 行锁定需知:

1、表的存储引擎需为InnoDB

2、为查询的条件创建索引

3、for update 关键字

4、行锁定查询需要放置在事物中

例:

Begin;

    select `id_sale` from `red_sale` where `id_sale` = 1 for update;

commit;

或者:

     set autocommit=0; select `id_sale` from `red_sale` where `id_sale` = 1 for update;

释放 set autocommit=1;

 

存储过程:

例子:

/****创建存储过程***/

DELIMITER $$            /***将DELIMITER 暂转换成$$,以便数据库将存储过程编译完成后,再执行***/

DROP PROCEDURE IF EXISTS `wbs`.`p_grad_red`$$    /***如果存在则删除这个存储过程***/

CREATE DEFINER = 'root'@'localhost' PROCEDURE `wbs`.`p_grad_red`(in saleId int, in gradId int, in repeatGrad int, out detailId int)

BEGIN

        DECLARE num INT;       /***定义变量****/

        START TRANSACTION; /**事物开启***/

        select id_sale from red_sale where id_sale=saleId for update;

        /***判断是否允许同个红包活动内,同一个人重复抢**/

        IF repeatGrad THEN

                 SET num=0;

         ELSE

                  select count(1) into num from red_detail where id_sale=saleId and id_grad=gradId;

         END IF;

         /****判断这个人是否已抢过红包***/

         IF num > 0 THEN

                   SET detailId=-1;

         ELSE

                   SET detailId=(select id_detail from red_detail where id_sale=saleId and id_grad=0 order by id_detail asc LIMIT 0,1);

                     IF detailId > 0 THEN

                                  update red_detail set id_grad = gradId , grad_time=now() where id_detail=detailId;

                     ELSE

                                  SET detailId=0;

                     END IF;

           END IF;

           select detailId;

           COMMIT;

 END$$

DELIMITER ;

/*** 回调存储过程 param1:红包ID, param2:抢红包用户ID, param3:是否允许在一个红包活动中同一个账号抢多次(1:允许,0:不允许), param4: 返回结果 return{0:该红包已被抢空, -1:该用户已抢过一次不可重复抢} ***/ call p_grad_red(1,2,1,@resultId);

select @resultId;

 

 

//mysql 表锁定与解除锁

查看当前被锁的表

show OPEN TABLES where In_use > 0;

// 查看数据库中表的状态,是否被锁;

SHOW PROCESSLIST;

 //杀掉被锁的表

kill 2726;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值