【问题标题】:Google datastore lock timeout谷歌数据存储锁定超时
【发布时间】:2015-12-17 23:02:57
【问题描述】:

我想知道如果我在 Google 数据存储区中运行事务并且在此过程中发生了一些事情导致我无法完成事务(比如应用程序服务器在等待响应时死机),会发生什么情况。此时,事务将锁定实体。我怎样才能在不删除/重新启动/等的情况下干净地解锁实体?是否存在任何类型的超时(比如事务是否需要超过 10 秒才能失败)?

【问题讨论】:

标签: google-app-engine transactions google-cloud-datastore


【解决方案1】:

根据Google Cloud Datastore documentationTransactions have a maximum duration of 60 seconds with a 10 second idle expiration time after 30 seconds。所以他们会自己超时。

如果服务器死机并且您收到事务超时,您将返回一个异常。如果您的应用程序死了,那么事务应该只是超时,并且由于事务是原子的,因此不会保留损坏的数据。

因此,除了在数据存储区出现异常时重新发送数据之外,不需要进行任何清理。

【讨论】:

  • 没问题!很高兴我能帮上忙!
  • 另外,如果你需要优雅地处理服务器错误,这里有一些nice documentation on that too.
  • afaik 不需要过期部分。数据存储事务不锁定实体。
【解决方案2】:

是的,交易确实会过期。碰巧的是,就在今天,我有一个编程“糟糕”,导致事务无法正确完成——因此我得到了 500 HTTP 状态,并且在日志中,有一个日志,详细的回溯结束于

BadRequestError: The referenced transaction has expired or is no longer valid

奇怪的是,当我再次运行相同的代码时(试图准确了解我做错了什么),第二次 HTTP 500 伴随着一个以

结尾的回溯
DeadlineExceededError: The overall deadline for responding to the HTTP request was exceeded.

我的代码中存在相同的潜在错误(我的响应时间过长),两个不同的异常 - 即关于哪个错误会首先触发的一些“竞争条件”,因为这两个问题的截止日期相同,均为 60 秒。

顺便说一句,这都是使用 Python(一直是我的最爱:-),但是虽然名称等可以更改,但数据存储的底层逻辑在任何 GAE 支持的语言中都应该是相同的。

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2019-02-06
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多