美文网首页
版本号扣减库存

版本号扣减库存

作者: Spring_java | 来源:发表于2021-06-26 20:35 被阅读0次

表结构

CREATE TABLE `price_version` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `total` decimal(12,2) DEFAULT '0.00' COMMENT '总值',
  `version` int(11) DEFAULT '0' COMMENT '并发版本控制',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1268 DEFAULT CHARSET=utf8;

SQL语句:

update price_version set  version=version+1 ,total=total-1 where id=#{id} AND  version =#{version} AND total >0 

代码:

    @Test
    public  void testVersion()throws Exception{
        final CountDownLatch countDownLatch=new CountDownLatch(3);
        for (int i = 0; i < 10; i++) {

            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
//                    countDownLatch.countDown();
                    PriceVersion priceVersion = priceVersionMapper.selectById(1);
                    int count= priceVersionService.updateByVersion(priceVersion);
                    if (count == 0){
                        logger.info(Thread.currentThread().getName()+"--更新失败");
                    }else {
                        logger.info(Thread.currentThread().getName()+"--更新成功");
                    }
                }
            });

            thread.start();
        }
//        countDownLatch.await();
        Thread.sleep(2000);
        System.out.println("所有测试任务全部完成");
    }
}

结果:

[2021-06-26 20:36:51] [Thread-9] INFO  com.xulei.test.TestPriceVersion - Thread-9--更新失败
[2021-06-26 20:36:51] [Thread-8] INFO  com.xulei.test.TestPriceVersion - Thread-8--更新失败
[2021-06-26 20:36:51] [Thread-12] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-12] INFO  com.xulei.test.TestPriceVersion - Thread-12--更新失败
[2021-06-26 20:36:51] [Thread-7] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-7] INFO  com.xulei.test.TestPriceVersion - Thread-7--更新失败
[2021-06-26 20:36:51] [Thread-10] INFO  com.xulei.test.TestPriceVersion - Thread-10--更新成功
[2021-06-26 20:36:51] [Thread-5] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-4] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-4] INFO  com.xulei.test.TestPriceVersion - Thread-4--更新失败
[2021-06-26 20:36:51] [Thread-5] INFO  com.xulei.test.TestPriceVersion - Thread-5--更新失败
[2021-06-26 20:36:51] [Thread-11] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-11] INFO  com.xulei.test.TestPriceVersion - Thread-11--更新失败
[2021-06-26 20:36:51] [Thread-3] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-6] DEBUG c.x.l.d.P.updateLock - <==    Updates: 0
[2021-06-26 20:36:51] [Thread-6] INFO  com.xulei.test.TestPriceVersion - Thread-6--更新失败
[2021-06-26 20:36:51] [Thread-3] INFO  com.xulei.test.TestPriceVersion - Thread-3--更新失败

分析:
1:使用数据库本身,update作为锁机制存在问题。
C线程查出来是10个
A线程扣减1个,剩9个
B线程更新了库存,变回10个
C更新的时候发现还是10个,则更新成功,
虽然最后C是更新成功了。但是处理业务期间,可能不知道变动情况。所以避免这个问题,要求不管谁修改了库存,一定要加个version递增版本号。

数据读取后,更新前数据被别人篡改过,version只能做递增
场景:商品秒杀、优惠券方法,需要记录库存操作前后的业务

相关文章

  • 版本号扣减库存

    表结构 SQL语句: 代码: 结果: 分析:1:使用数据库本身,update作为锁机制存在问题。C线程查出来是10...

  • 电商产品库存扣减逻辑

    解读库存扣减逻辑: 1.库存主要分 总库存 冻结库存 可用库存 2.库存在提交订单的时候增加冻结库存并扣减可用库存...

  • 库存扣减

    此篇文章来自于京东大神开涛的微信公众号中的内容,感谢开涛大神,慢慢的干活,地址如下: https://mp.wei...

  • 分布式事务

    使用场景 例如: 电商下单 订单生成+扣减库存订单生成属于订单系统,扣减库存属于库存系统 db本地事务如何保证的?...

  • go-zero基础组件-分布式锁RedisLock

    为什么需要分布式锁 用户下单 锁住uid,防止重复下单。 库存扣减 锁住库存,防止超卖。 余额扣减 锁住账户,防止...

  • 用 Go + Redis 实现分布式锁

    为什么需要分布式锁 用户下单 锁住 uid,防止重复下单。 库存扣减 锁住库存,防止超卖。 余额扣减 锁住账户,防...

  • 高并发场景下强一致预算/库存扣减方案

    场景描述 对于预算扣减/库存扣减类场景,我们需要根据业务对已有预算/库存做减法,拿发券的场景来举例: 需要满足不同...

  • RabbitMQ 消息顺序、消息幂等、消息重复、消息事务、集群

    1. 消息顺序 场景:比如下单操作,下单成功之后,会发布创建订单和扣减库存消息,但扣减库存消息执行会先于创建订单消...

  • Day83 分布式事务解决方案 & 中台架构落地

    2 阶段,创建订单,扣减库存 请求调用订单服务 1 创建订单---> 订单库 2 库存库减库存. 订单服务 ...

  • 电商架构实践-库存一致性实现方案

    前言 最近在梳理后端业务场景时,发现商品库存扣减逻辑的实现存在一定的风险。所以,针对目前库存扣减实现方案做一些分析...

网友评论

      本文标题:版本号扣减库存

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