2010-08-02 1 views
1

, что было бы лучшим способом создать механизм, который гарантирует, что, например:Аукциона сделка стиля на GAE и BigTable

Два человек не будет покупать то же пункт в то же время в аукционе, основанной на применении GAE, используя BigTable?

Если бы кто-нибудь мог просветить меня с описанием «под капотом», я был бы благодарен.

ответ

3

Такую сделку довольно просто реализовать с помощью AppEngine. Ключ run_in_transaction метод:

class AuctionItem(db.Model): 
    sold = db.BooleanProperty() 
    purchaser = db.UserProperty() 

def buy(self, buyer): 
    def buy_txn(): 
     sale_success = False 
     if self.sold == False: 
      self.sold = True 
      self.purchaser = buyer 
      self.put() 
      sale_success = True 
     return sale_success 

    success = db.run_in_transaction(buy_txn, buyer) 
    return success 
+1

Я думаю, что я бы найти пылесос только проверить/обновить одно поле, в этом случае 'purchaser', так как проданный' false' тогда и только тогда Покупатель 'None', и вице- наоборот. Наверное, личное предпочтение. –

+0

В вашем примере, когда происходит get() на AuctionItem? Разве это не должно произойти в рамках транзакции? – cope360

0

В транзакции убедитесь, что аукцион по-прежнему открыт, например, проверяя, что поле winner не установлено, и если да, установите winner текущему пользователю.

Поскольку это происходит в транзакции, нет никаких шансов, что элемент будет схвачен в середине транзакции. Если другой пользователь попытается выиграть аукцион в тот же момент, они не смогут писать элемент до тех пор, пока первый пользователь не будет выполнен, и в этот момент «он все еще доступен?». проверка завершится ошибкой.

Смежные вопросы