悲观锁和乐观锁

1-乐观锁:

乐观锁并不是真正的锁,只是更新数据的时候多加一层判断

例1:

	  更新的时候判断此时库存是否和之前查询的库存一样,
	  如果一样则表示没人修改,可以进行更新;
	  否则表示有人抢过该资源,不再进行更新
	  
		update tb_sku set stock=2 where id=1 and stock=7;
		SKU.objects.filter(id=1, stock=7).update(stock=2)

例2

	也可以在表中加一个version字段或者是时间戳字段, 每做一次操作, 对version+1
	1. 查出商品信息 
	    select (status,status,version) from t_goods where id=#{id}
	2.根据商品信息生成订单
	3. 修改商品status:
		update t_goods  set status=2,version=version+1  where id=#{id} and version=#{version};

只适用于并发较少的情况,如果失败次数过多,会带给用户不良体验,
同时适用该方法要注意数据库的隔离级别一定要设置为Read Committed 。

2-悲观锁

行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。

悲观并发控制主要用于数据争用激烈的环境,
以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。

流程:

  1. 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。
  2. 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。
  3. 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。
  4. 其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。

注意: 要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。set autocommit=0;

## 0.开始事务: 
		 begin;/begin work;/start transaction; (三者选一就可以)
## 1.查询出商品信息: 
		select status from t_goods where id=1 for update;
## 2.根据商品信息生成订单  
	insert into t_orders (id,goods_id) values (null,1);
## 3.修改商品status为2
	update t_goods set status=2;
## 4.提交事务
	commit;/commit work;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值