V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gibber
V2EX  ›  程序员

请问在生成自增编码的时候如何处理并发的问题

  •  
  •   gibber · 2020-02-15 16:41:48 +08:00 · 1673 次点击
    这是一个创建于 1733 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求: 1.新增商品信息,根据选择的商品类别生成唯一的商品编码,编码的规则是类别编码加 4 位自增编码,如在 001 分类下增加商品,商品编码就是 0010001,0010002...,每个类别最多存放 9999 个商品 2.在新增页面选择类别后就要生成编码显示在页面上,同一类别下一次可以新增多个商品

    请问该如何生成后面的 4 位自增编码才能避免并发操作时候的重复问题?

    ggabc
        1
    ggabc  
       2020-02-15 16:48:54 +08:00
    共享 redis 锁,每次生成新码时候锁一下
    gibber
        2
    gibber  
    OP
       2020-02-15 17:16:01 +08:00
    @ggabc 意思是生成新码后在 redis 里面加个锁,等保存成功后再删除锁?
    yuanwang33
        3
    yuanwang33  
       2020-02-15 17:53:15 +08:00
    如果使用 redis,可以考虑使用 INCR 特性,将商品编码作为 key 的元素。
    参考文档: https://redis.io/commands/INCR
    gibber
        4
    gibber  
    OP
       2020-02-15 18:21:31 +08:00
    @yuanwang33
    是考虑过用 incr,用分类的编码做 key,自增码做值,每次 incr 后拼接成商品编码.
    但这样遇到个问题,就是编码是在选择分类的时候生成,最后并不一定会保存到数据库,如果用户取消操作或者切换分类那已经生成的码就无法再继续使用了
    gibber
        5
    gibber  
    OP
       2020-02-16 08:26:53 +08:00
    通常的做法是怎样的呢?
    yuanwang33
        6
    yuanwang33  
       2020-02-16 14:14:56 +08:00
    不太清楚你们大的需求,建议设计两个 ID,内部系统使用和外部展示,对内连续单调递增的在写入数据库前生成,对外的不连续(避免外部推算数量)的展示到前台给用户。
    根据你描述的内容,单个 ID 如果严格要求单调递增,所有的用户串行操作才能实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.