代码之家  ›  专栏  ›  技术社区  ›  muffin

postgresql-如何防止在竞争性投币角逐中重复插入

  •  0
  • muffin  · 技术社区  · 6 年前

    我不知道如何正确表达我的问题。但是,为了提供关于我试图解决的问题的更多细节,让我描述一下我的应用程序。假设我正在尝试实现一个队列保留应用程序,并且我大致维护了一个表中的插槽数。

    id | appointment | slots_available | slots_total
    ---------------------------------------------------
    1  | apt 1       |      30         |     30
    2  | apt 2       |      1          |     5
    .. | ..          |      ..         |     ..
    

    所以,在竞争场景中,假设所有东西都在应用程序端工作。一个场景可能发生在应用程序中:

    user 1 -> reserves apt 2 -> [validate if slot exists] -> update slot_available to 0 -> reserve (insert a record)
    user 2 -> reserves ap2 2 -> validate if slot exists -> [update slot_available to 0] -> reserve (insert a record)
    

    如果用户1和2碰巧发现 同时为APT2提供插槽 在用户界面中?(当然,如果有一个槽,我会首先验证,但如果还没有一个槽单击,它们将在ui中看到相同的值)。然后两人同时提交预订。

    现在,如果用户1验证是否有可用的插槽,即使用户2已经使用了该插槽,但更新操作尚未完成,该怎么办?然后 会有两个插页 .

    不管怎样,我怎样才能保证只有一个人在 数据库级别 ?我确信这是一个常见的场景,但是我还不知道如何实现这样的场景。只要解决了这种情况,重新建模的建议也是可以接受的。

    0 回复  |  直到 6 年前