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

一个关于并发插入数据库的问题,想请教下各位大佬。

  •  
  •   youEclipse · 2017-11-01 21:03:44 +08:00 · 2240 次点击
    这是一个创建于 2577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景是: 某个接口会先查询数据库是否有这条记录,记录是有唯一索引的。 如果查询到存在则更新,没有则插入。

    问题是:
    在同时发起 2 个相同的请求时,则由于 2 个请求开始都查询没有这条记录,都会执行插入操作,这样会导致其中一条插入失败。 请问各位大佬有没有比较好的方案来处理类似问题。一开始想的是用 upsert,但是 upsert 每次都是删除记录再插入,id 增长太快了。

    7 条回复    2017-11-01 21:20:01 +08:00
    hustlike
        1
    hustlike  
       2017-11-01 21:07:30 +08:00   ❤️ 1
    insert if not exists ?
    redtea
        2
    redtea  
       2017-11-01 21:09:48 +08:00
    分布式锁
    changnet
        3
    changnet  
       2017-11-01 21:10:41 +08:00 via iPad   ❤️ 1
    如果不复杂,用 duplicate key update,复杂就写个存储过程。我说的是 MySQL
    panpanpan
        4
    panpanpan  
       2017-11-01 21:12:50 +08:00 via iPhone
    加锁,专门干这事的
    fuyufjh
        5
    fuyufjh  
       2017-11-01 21:17:42 +08:00
    INSERT ... ON DUPLICATE KEY UPDATE
    alcarl
        6
    alcarl  
       2017-11-01 21:19:27 +08:00 via Android
    插入失败时,再更新一下就好啦
    rbe
        7
    rbe  
       2017-11-01 21:20:01 +08:00 via iPhone
    id 增长太快会有什么问题吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5299 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.