mysql中悲观锁的使用

一、普通用法

场景举例:
商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品status为1。假设商品的id为1。如果不采用锁,那么操作方法如下:

/1.查询出商品信息
select status from t_goods where id=1;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;

当高并发访问的情况下会出现问题,这就要用到锁。

二、通过数据库实现悲观锁

悲观锁的实现,往往依靠数据库提供的锁机制。使用悲观锁的原理:当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。

//使用悲观锁,首先要关闭mysql数据库的自动提交属性

set autocommit=0;  
//设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:
//1.开始事务
start transaction; 
//2.查询出商品信息
select status from t_goods where id=1 for update;
//3.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//4.修改商品status为2
update t_goods set status=2;
//5.提交事务
commit;

三、详解数据库锁(行级锁和表级锁)

1.当使用select…for update会把数据给锁住,MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

2.测试数据库锁

数据库表t_goods,包括id,status,name三个字段,id为主键,数据库中记录如下:

(1)行级锁(指定主键,并且有此数据,row lock)

(2)表级锁(无主键、主键不明确,table lock)

//主键不明确,出现表级锁

//除了主键外,使用索引也会影响数据库的锁定级别。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值