concurrency - 使用 PayPal 在线订票 : Prevent multiple visitors from buying same ticket

标签 concurrency paypal conditional-statements payment race-condition

我正在为事件(如音乐会)开发在线票务系统。一个基本部分是座位表,访客将看到可供选择的可用座位/门票。一旦他们做出选择,系统会立即尝试将门票保留 10 分钟(通过将门票 ID 输入表格,其中门票 ID 是关键)。 仅当预订成功时,才会显示 paypal 按钮以进行付款。

一切正常。订票对我来说不是问题。我可以在我的系统中处理。但是一旦 paypal 进入游戏,事情就变得困难了。

问题: 如果用户出于某种原因在 Paypal 上花费了很多时间(超过 10 分钟),我网站上的门票预订将过期,允许其他访客购买门票,这可能发生在访客 1 付款之前。访客 1 看不到任何这些,因为他仍在使用 paypal ......在某个时间点,他将设法付款(例如 15 分钟后),这将完美地工作,因为 paypal 对过期的预订一无所知.

最后,我可能有两个访客支付了同一张票/座位!

我怎样才能防止这种情况发生? 如果涉及两个系统并且其中一个不在您的控制范围内,您将如何处理竞争条件?

我的想法是:实际上应该在付款之前进行支票,但我当然无法控制 paypal 中发生的事情!

我知道我可以使用 Paypal 的 IPN 等,但这只会在付款后发生,为时已晚。

或者,如果 Paypal 通过 API 要求我确认付款,那就太好了。如果门票已卖给其他人,我可以说“不”。但我认为使用 paypal 是不可能的。

最佳答案

我建议使用 Express Checkout。 Express Checkout 允许您控制付款发生的时间,因为您将触发对 PayPal 的 API 调用以实际处理付款。

您可以研究的另一种可能性是使用授权而不是销售交易。这样一来,如果其他买家入座,您可以取消授权,并且不会向买家收费。 (但是,PayPal 可能会向您收取作废授权的费用。)

关于concurrency - 使用 PayPal 在线订票 : Prevent multiple visitors from buying same ticket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14815874/

相关文章:

paypal - PayPal Donate 是否支持支付数据传输?

paypal - 如何在同一表单中使用Paypal IPN通知和notify_url?

c# - 电池电量 IF 语句

java - 扑克游戏手牌评估器数组条件结构

java - 与 Java .equals() 方法相反?

java - 队列的同步

java - 可重入锁对象锁定

ios - iOS中并发队列使用序列化目标队列

paypal - Paypal Sandbox 离线了吗?

debugging - RejectedExecutionException和Clojure并发