【问题标题】:GAE: How to rollback a transaction?GAE:如何回滚事务?
【发布时间】:2017-01-17 15:03:00
【问题描述】:

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

其中一个是:

如果事务失败,请确保您尝试回滚事务。 回滚最小化不同请求的重试延迟 在事务中竞争相同的资源。请注意,一个 回滚本身可能会失败,所以回滚应该是尽力而为 仅尝试。

我认为事务回滚是 GAE 为你做的,但上面的引用说你应该自己做。

文档here 还说您应该进行回滚,但没有说明如何进行。

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

【问题讨论】:

  • 引用文本中的注意事项:“回滚最小化重试延迟”-恕我直言,这意味着如果您自己尝试回滚,它可能会发生得更快。如果不是,GAE 最终会为您完成,但可能需要更长时间,从而减慢其他竞争交易。

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


【解决方案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 客户端库可以将多个操作分组到一个事务中。除非事务中的每个操作都成功,否则事务无法成功;如果任何操作失败,事务将自动回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2010-10-04
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2012-01-16
    相关资源
    最近更新 更多