【发布时间】:2014-03-04 01:00:09
【问题描述】:
我想这是一个经典的并发问题。
我有人报名参加活动。该事件可以处理最大数量的参与者。
这是一个带有 PostgreSQL 数据库的 Symfony 应用程序。
确保活动不会超额预订的最佳方法是什么?
假设我有名为 Event、Person 和 Booking 的实体。 Booking 与 Person 和 Event 有一对多的关系。
我显示有关该事件的页面。我计算当前预订,如果数量小于最大值,则显示“立即预订”按钮。
这是我以前如何完成此操作的一些伪代码:
关于立即预订按钮的操作:
Count bookings
if count >= max
return "Sorry, this event is full"
else
Create booking
Flush entity manager
Count bookings again
if count > max
Delete booking
return "Sorry, this event is full"
endif
结束
我认为这种方法是安全的,但并不理想。我认为这可能会导致两个人预订时,只剩下一个空间并且两个人都被拒绝了。现实世界中发生这种情况的可能性可能接近于零,我猜用户会再试一次,但是……如果能正确地做到这一点,那就太好了。
有没有更好的方法来做到这一点?
我读过这篇文章:Handling the concurrent request while persisting in oracle database? 和几个月前我问过的一个类似问题。当最大预订量 = 1(例如航空公司座位)时,乐观锁定似乎是一个好策略。在那种情况下,我可能根本就没有 Booking 实体。事件是否只有一个人。
【问题讨论】:
标签: postgresql symfony concurrency