乐观锁和悲观锁(共享锁和排它锁) 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 

 

 

 

你可能感兴趣的:(sql)