Проектирование приложений электронной коммерции: как управлять корзинами на сайте подержанных товаров?

Я создаю торговую площадку электронной коммерции для подержанных товаров, используя Ruby on Rails с API PayPal для совершения покупок. По сути, суть в том, что люди могут покупать и продавать свои вещи - как на eBay или Half.com. Все товары являются подержанными. Вот мой вопрос: подержанные товары означают, что каждый товар уникален - по крайней мере, в том смысле, что продавцы обычно имеют только 1 подержанный товар, который они продают. В связи с этим у меня возникает вопрос к разработчикам, которые уже сталкивались с подобной проблемой: как мне поступить в ситуации, когда:

  • Продавец выставляет свою толстовку
  • Человек №1 добавляет толстовку в корзину
  • Человек №2 добавляет ту же толстовку в корзину
  • Человек №1 выписывается через PayPal

Теперь, что мне делать с человеком №2? Очевидно, что он не может проверить ту же самую толстовку, потому что у продавца есть только 1 толстовка. Я хочу знать, как мне поступить в этой ситуации. Пока что я придумал два возможных решения, но ни одно из них не кажется мне удовлетворительным. (Кстати, уместно добавить, что текущая корзина пользователя является сессионной переменной)

Вариант №1: Когда человек №1 добавляет толстовку в свою корзину, вы отмечаете ее булевым полем, например, available = false. Недостатком этого варианта является то, что пользователь может добавить товар в корзину, а затем выйти из нее. Таким образом, никто не сможет приобрести этот товар, пока не закончится срок действия корзины пользователя №1.

Вариант №2: Толстовка помечается как недоступная только тогда, когда я получаю IPN от PayPal. Недостатком этого варианта является то, что теоретически вы можете иметь человека №1 и №2, одновременно проверяющих PayPal, и таким образом они оба купят толстовку, и только после того, как я получу IPN, я пойму, что продал товар дважды.

Что думает StackOverflow? Есть ли кто-нибудь с опытом в этой области, кто может предложить свое мнение?

9
задан varatis 15 January 2012 в 22:12
поделиться