【问题标题】:Has the transaction behavior changed when a conflict occurred in firestore datastore?当 Firestore 数据存储发生冲突时,事务行为是否发生了变化?
【发布时间】:2020-05-16 00:33:03
【问题描述】:

我创建了新的 Google Cloud Platform 项目和 Datastore。

Datastore 被创建为“Datastore 模式下的 Firestore”。

但是,如果发生冲突,我认为 Firestore 数据存储和旧数据存储的行为会有所不同。

例如以下情况。

procA: -> enter transaction -> get -> put -----------------> exit transaction
procB: -----> enter transaction -> get -> put -> exit transaction

旧数据存储;

  • procB 已完成,数据已更新。
  • procA 发生冲突,数据已回滚。

Datastore 模式下的 Firestore;

  • procB 在退出事务之前等待,直到 procA 完成。然后发生冲突。
  • procA 已完成,数据已更新。

是规格吗? 我在 Google Cloud Platform 文档中找不到文档。

【问题讨论】:

  • @DanCornilescu 你谈到的帖子是关于“尽管 entityGr 与 ndb 中的 Gr 不同,但发生冲突”。我认为这是另一个话题。我的结果是使用 google-client library.Conflict如果 entityGr 不是 sameGr,则不会发生。
  • 没错。 不应该存在冲突,但报告的行为似乎会存在冲突。该解释一旦找到,可能也适用于您的案例。
  • 您使用的是python2 ndb client 还是cloud ndb
  • 我正在使用python client library。我认为 GUI GCP 控制台的行为似乎相同。(在客户端库的事务中获取 & 放置 & 睡眠,然后 GUI 编辑正在等待。旧数据存储不等待。)
  • 来自 GUI 等待的好提示 - 我认为这表明行为更改来自数据存储端,而不是客户端,因此与其他帖子无关。

标签: google-cloud-platform google-cloud-firestore google-cloud-datastore


【解决方案1】:

我一直在考虑,我认为更改实际上可能是故意的。

在您基本上描述的旧行为中,较短的事务即使在较长的事务之后开始,也会成功,抢占较长的事务并导致它失败并重试。实际上,这会优先处理较短的事务。

但是想象一下,您有一堆较短交易的活动高峰 - 它们将继续抢占较长的交易,这些交易将继续重试,直到最终达到最大重试限制并永久失败。由于重试,还会增加过程中的数据存储争用。我实际上在我的事务繁重的应用程序中遇到了这种情况,我不得不调整我的算法来解决它。

相比之下,新行为使所有交易都有公平的成功机会,无论其持续时间或活动水平如何 - 没有优先处理。确实,以一定的价格 - 较短的交易在较长的交易之后开始并且重叠它们将需要更长的时间。恕我直言,新行为比旧行为更可取。

【讨论】:

【解决方案2】:

我建议您查看文档Transactions and batched writes。在本文档中,您将能够找到有关如何使用 Firestore 执行事务的更多信息和示例。

在上面,您会发现更多关于get()set()update()delete() 操作的说明。

我可以从文档中为您突出显示以下内容,这是您在处理交易时要注意的非常重要的内容:

  • 读操作必须先于写操作。
  • 如果并发编辑影响事务读取的文档,则调用事务的函数(事务函数)可能会运行多次。
  • 事务函数不应直接修改应用程序状态。
  • 客户端离线时事务会失败。

如果这些信息对您有帮助,请告诉我!

【讨论】:

  • 您指向的文档指的是 Firestore 本机模式,而不是 Datastore 模式(我也相信您的回答)。不是一回事,见Choosing between Native Mode and Datastore Mode
  • @gso_gabriel 我知道“如何使用事务”。因为我的代码在旧数据存储中运行良好。根据“快照隔离”,我理解的数据存储控制冲突。但是数据存储模式下的 Firestore 不遵循该规则.
  • 嘿@stack_user 在数据存储模式下查看有关Isolation and Consistency 的文档,似乎它确实使用了可序列化隔离和事务隔离。你能检查一下我提到的这个,并确认你的代码是否在这里?
  • 是的,我知道你教的主题。但是数据存储隔离解决方案是快照隔离。这意味着第一次提交成功,之后提交失败并重试,我认为(旧数据存储做到了。)
  • 使用的隔离方法在数据存储模式下是可序列化的,如文档中所述。快照仅用于保持数据的状态,以防万一发生故障。考虑到这一点,我会说这种行为是意料之中的。
猜你喜欢
  • 2020-08-16
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2011-09-28
  • 2019-05-23
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多