乐观锁和悲观锁(共享锁和排它锁) TODO

一、简介

             乐观锁是自己通过加字段如version实现的,而非数据库自带的。适用于锁冲突比较小的情况。

             悲观锁是通过for update添加的,数据库的锁,适用于锁冲突比较大的情况;

二、乐观锁

2.1 思路

  • 先给表添加一个整型的version字段;
  • 先查询出来当前记录的version, 然后修改当前记录相关信息,并且将version的值改为version + 1, 条件除了相关的,还需要加上version = 上面查询出来的version的值;  通过version条件即可判断这段时间是否有并发修改操作,如果有的话,version值已经被加一过的,是不相等的,这样就不会再次修改了,如果没有的话,就可以直接修改,从而保证了并发;
  •  

2.2 代码案例 TODO

  • 查询出商品信息  select (status,status,version) from t_goods where id=#{id}
  • 根据商品信息生成订单
  • 修改商品status为2 update t_goods set status=2,version=version+1 where id=#{id} and version=#{version};

2.3 思考

 

三、悲观锁 

3.1 思路

  • 悲观锁是通过for update添加的,数据库的锁,适用于锁冲突比较大的情况;
  • 悲观锁涉及到俩个数据库锁,一个是共享锁,一个是排它锁‘
  • 共享锁又称读锁,简称S锁,多个事务对于同一个数据可以共享一把锁,都能读数据,但是不能改数据;
    • select ... lock in share mode
  • 排它锁又称写锁,简称X锁,排它锁不能和其它锁共存,如一个事务获取了一个数据行的排它锁,其他事务就不能再对该行数据继续叠加其它锁,包括共享锁和排它锁。但是拥有该排它锁的事务是可以对数据行进行读取和修改的;
    • select ...for update
  • mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁; 
  • select语句默认不会加任何锁类型。所以加了排它锁的记录使用单纯的select是仍然可以查询到记录的,但是使用了读写锁的查询是需要等待排它锁释放之后才可以查询到记录的。
  • 悲观锁在使用的时候必须手动关闭事务自动提交;

3.2 模拟案例 TODO

https://www.jianshu.com/p/e5d193cf4b40 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值