PostgreSQL-如何防止在竞争性的老虎机比赛中重复插入

时间:2018-10-30 13:40:44

标签: sql postgresql insert locking

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

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中看到相同的值)。然后两个人同时提交保留。

现在,如果用户2验证了是否有可用的插槽,即使用户2已经使用它,尽管更新操作尚未完成,该怎么办?然后将有两个插入

无论如何,如何确保只有其中一个在数据库级别上获得预订?我敢肯定这是一个常见的情况,但是我还不知道如何实现这样的事情。只要解决方案,建议重塑也是可以接受的。

0 个答案:

没有答案