假设您使用交易来处理Stripe付款并更新用户实体:
@ndb.transactional
def process_payment(user_key, amount):
user = user_key.get()
user.stripe_payment(amount) # API call to Stripe
user.balance += amount
user.put()
Stripe API调用可能会成功,但是put
可能会因为争用而失败。然后会向用户收费,但他的帐户不会反映付款。
您可以将Stripe API调用从事务中拉出,然后再进行事务,但是看来您仍然遇到相同的问题。收费成功,但交易失败,并且未记入用户的帐户。
这似乎是一个非常普遍的情况。如何正确处理呢?
答案 0 :(得分:2)
为使操作正常,事务功能必须是幂等的。因此,您无法在此类函数内进行条纹调用,因为这将使其成为非幂等。
我将分开调用数据条,并且在API成功后,我将调用一个事务处理功能来更新用户的帐户余额(在发生争用时可以安全地重试)。
甚至可以创建一个单独的独立实体来反映条纹API调用结果?这样的实体应该没有争用的余地,因为它只写入一次(发生条带事务时)。这将使您能够:
@thebjorn的评论很不错:多步骤方法可以使该过程非常可靠: