2010-08-02 7 views
1

quelle serait la meilleure façon de créer le mécanisme qui assure que, par exemple:transaction de style vente aux enchères sur GAE et BigTable

Deux personnes ne seront pas acheter même article en même temps aux enchères en fonction de l'application GAE à l'aide BigTable?

Si quelqu'un pouvait m'éclairer avec un genre de description "sous le capot", je serais reconnaissant.

Répondre

3

Une telle transaction est assez simple à mettre en œuvre avec AppEngine. La clé est la méthode 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

Je pense que je trouverais plus propre de ne vérifier/mettre à jour un champ, dans ce cas 'purchaser', puisque vendu est' false' acheteur est ssi 'none', et vice versa. Préférence personnelle cependant, je suppose. –

+0

Dans votre exemple, quand le get() sur AuctionItem se produit-il? Cela ne doit-il pas arriver dans la transaction? – cope360

0

Dans la transaction, vérifiez que l'enchère est toujours ouverte, par exemple en vérifiant que le champ winner n'est pas défini et, si c'est le cas, définissez winner sur l'utilisateur actuel.

Étant donné qu'il se produit dans une transaction, il n'y a aucune chance que l'article soit saisi en cours de transaction. Si un autre utilisateur tente de gagner l'enchère au même moment, il ne pourra pas écrire sur l'élément tant que le premier utilisateur n'aura pas terminé, à quel moment le "est-il encore disponible?" vérifier échouera.

Questions connexes