乐观锁解决并发问题

作者: 就没一个昵称能用 | 来源:发表于2019-04-17 11:03 被阅读4次

业务场景

一般的商城业务中,我们经常会遇到一种场景,某商品库存只剩最后一件,但此时有多个用户同时下单,如果没有做任何的处理,多个用户下单时进程读取到的库存为1,程序判断符合扣库存条件,下单成功,就会造成库存变成负数的情况

解决方案

思路

乐观锁通过增加一个每次更新库存都会自增的version字段来解决这个问题,每个进程读取库存字段的同时,也会读取version的值,在更新库存同时更新version,并增加对version字段值的判断

代码实现
<!-- 乐观锁更新库存 -->
<update id="newMinStock" parameterType="java.util.Map">
    update goods
    set stock= stock - 1,version = #{version} + 1
    where id  = #{id} and version = #{version}
</update>

假设有两个进程都读取到了stock的值为1,version默认值为0,则这两个进程执行的更新语句都是update goods set stock=stock-1,version=version+1 where id=1 and version=0,当其中一个进程执行成功之后,数据库中version的值就会变为1,剩下的进程不会执行成功,这样保证了stock的值不会小于0

Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("version", version);
int result = goodsMapper.newMinStock(map);

if (result != 1) {
    throw new RuntimeException("更新商品库存失败");
}

在业务层判断更新库存是否成功,进行相应的业务处理

相关文章

  • MySQL的锁

    1、乐观锁与悲观锁是两种并发控制的思想,可用于解决丢失更新问题:乐观锁会“乐观地”假定大概率不会发生并发更新冲突,...

  • MySQL悲观锁与乐观锁的实现方案

    我们知道Mysql并发事务会引起更新丢失问题,解决办法是锁,所以本文将对锁(乐观锁、悲观锁)进行分析 悲观锁和乐观...

  • 使用MySQL悲观锁解决电商扣库存并发问题

    昨天写了乐观锁《使用MySQL乐观锁解决电商扣库存并发问题》,有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁...

  • 乐观锁解决并发问题

    业务场景 一般的商城业务中,我们经常会遇到一种场景,某商品库存只剩最后一件,但此时有多个用户同时下单,如果没有做任...

  • MySQL更新死锁问题

    转载:http://ju.outofmemory.cn/entry/216512 就是如何利用乐观锁来解决并发问题...

  • ES并发冲突问题与悲观锁与乐观锁并发控制

    1、ES并发冲突问题 2、悲观锁与乐观锁两种并发控制解决方案 悲观锁的优点是:方便,直接加锁,对应用程序来说,透明...

  • 面试官一次次问Java的锁时,你是怎么回答的?80%的人都说不完

    乐观锁与悲观锁 乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是两种完全不同的思想。它们的使用非常广泛...

  • 关于java中的锁的理解

    乐观锁与悲观锁 乐观锁和悲观锁都是用于解决并发场景下的数据竞争问题,但是却是两种完全不同的思想。它们的使用非常广泛...

  • MyBatis-Plus乐观锁插件的使用

    乐观锁是为了解决应用多实例,数据库单一实例时,并发修改同一条记录可能造成的并发问题。一般来说,乐观锁的实现方案都是...

  • 2018-07-09

    乐观锁 VS 悲观锁 1、锁是为了解决,并发(同时修改数据)的问题;2、事务是为了保证数据的原子性(要么都成功要么...

网友评论

    本文标题:乐观锁解决并发问题

    本文链接:https://www.haomeiwen.com/subject/jnyvwqtx.html