zoukankan      html  css  js  c++  java
  • 商城业务如何增加或者减少库存

    库存的变化是原子性的,如果在更新的库存的时候没有考虑好如何更新库存,那么会导致库存的 重复修改、脏读、幻读、不可重复读等操作。

    但如果加锁的粒度过于大的话,就会导致大量的更新库存的请求失败。无法支持高并发的。

    那么该怎么样写合适代码来更新库存呢?

    其实核心思想是:

    1. 加事务

    2. 查询更新

    先看下导致重复修改的代码:

     

     虽然这个方法是加了事务,然而事务在执行的过程中,只能保证事务的独立性,但是在更新库存的时候,还是造成了重复写入的错误。

    接着看下,第一版本的优化:

     第一版的优化方法是对每个skuId加了一个锁,保证同一时刻对某一sku_id的操作是唯一的,但是这种方法无法支持高并发,对一个高并发的网站来说不是一个很好的选择。

    再看下第二版本的优化:

     这个版本的优化是在执行更新操作的时候,比较一下skuId的库存数是不是和原先的一样,如果一样的话就更新,如果不一样的话就更新失败。

    我们这样想,同时有10个请求进来,对数据库进行操作。第一个请求更新完库存后,其他9个请求去校验库存,库存校验这个时候一定是失败的,这样会导致另外9的请求的更新库存是失败的。

    最后再看下最终版本的解决方法:

     最后的方法是将判断库存是不是足够,以及增加库存的语句放到了一个sql里,这样的话,每个事务在执行的时候只需要判断,库存是不是足够就行了。并不会影响每个事务的更新操作。

  • 相关阅读:
    在IDEA上本地更新同步Git中的更改
    protobuf的序列化和反序列化
    关于Pytorch报警告:Warning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead
    990. 等式方程的可满足性
    死锁
    事务隔离
    Lab-1
    软件测试homework3
    TCP/UDP网络连接的固定写法
    软件测试Homework 2
  • 原文地址:https://www.cnblogs.com/cjjjj/p/12602459.html
Copyright © 2011-2022 走看看