GAE:如何回滚交易?

时间:2017-01-17 15:03:01

标签: google-app-engine transactions google-app-engine-python

我刚刚阅读了GAE最佳做法的精彩摘要:https://cloud.google.com/datastore/docs/best-practices

其中一个是:

  

如果事务失败,请确保尝试回滚事务。   回滚可以最大限度地减少不同请求的重试延迟   争夺交易中的相同资源。注意一个   回滚本身可能会失败,因此回滚应该是最好的努力   只尝试。

我认为交易回滚是GAE为你做的事情,但上面的引言说你应该自己做。

文档here也说你应该做回滚,但没有说明如何。

那么,如何在GAE Python中回滚事务?

1 个答案:

答案 0 :(得分:1)

最佳做法文档是直接通过其API或客户端库使用Cloud Datastore。

仅在灵活的Appengine环境中才需要这样做。即使在这种情况下,Cloud Datastore client library也提供了一个自动处理回滚的上下文管理器 - 这个示例代码来自the docs

def transfer_funds(client, from_key, to_key, amount):
    with client.transaction():
        from_account = client.get(from_key)
        to_account = client.get(to_key)

        from_account['balance'] -= amount
        to_account['balance'] += amount

        client.put_multi([from_account, to_account])

docs州:

  

默认情况下,如果事务块退出时出现错误,则回滚事务

请注意,客户端库仍处于测试阶段,因此以后行为可能会发生变化。

在标准的Appengine环境中,ndb库提供了automatic transaction rollback

  

NDB客户端库可以在单个事务中对多个操作进行分组。除非事务中的每个操作都成功,否则事务不会成功;如果任何操作失败,则会自动回滚事务。