gae*_*fan 8 python google-app-engine transactions app-engine-ndb
假设您使用交易来处理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()
Run Code Online (Sandbox Code Playgroud)
Stripe API调用有可能成功,但put由于争用而失败。然后会向用户收费,但他的帐户不会反映付款。
您可以将Stripe API调用从事务中拉出,然后再执行事务,但是看来您仍然遇到相同的问题。收费成功,但交易失败,并且未记入用户的帐户。
这似乎是一个非常常见的情况。如何正确处理呢?
为了正确操作,事务功能需要是幂等的。因此,您不能在此类函数内进行条带调用,因为这会使其成为非幂等的。
我会将条带调用分开,并且在 API 成功后,我将调用事务函数来更新用户的帐户余额(在发生争用时可以安全地重试)。
甚至可能创建一个单独的、独立的实体来反映条带 API 调用结果?这样的实体应该没有争用的空间,因为它只写入一次 - 当条带事务发生时。这将使您能够:
@thebjorn 的评论很好:多步骤方法可以使该过程非常可靠:
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |