Google cloud platform firestore数据存储中发生冲突时,事务行为是否已更改?

Google cloud platform firestore数据存储中发生冲突时,事务行为是否已更改?,google-cloud-platform,google-cloud-firestore,google-cloud-datastore,Google Cloud Platform,Google Cloud Firestore,Google Cloud Datastore,我创建了新的谷歌云平台项目和数据存储 数据存储创建为“数据存储模式下的Firestore” 但是,我认为如果发生冲突,Firestore数据存储和旧数据存储的行为会有所不同 e、 g以下情况 procA: -> enter transaction -> get -> put -----------------> exit transaction procB: -----> enter transaction -> get -> put -> exi

我创建了新的谷歌云平台项目和数据存储

数据存储创建为“数据存储模式下的Firestore”

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

e、 g以下情况

procA: -> enter transaction -> get -> put -----------------> exit transaction
procB: -----> enter transaction -> get -> put -> exit transaction
旧数据存储

  • procB已完成,数据已更新
  • 发生冲突,数据已回滚
数据存储模式下的Firestore

  • procB在退出事务之前等待,直到procA完成。然后发生冲突
  • procA已完成,数据已更新
是规格吗?
我在Google云平台文档中找不到文档。

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

在上面,您将看到有关
get()
set()
update()
delete()
操作的更多说明

我可以从文档中为您强调以下内容,这对于您在处理交易时要注意的事项非常重要:

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

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

我已经考虑过了,我认为这种改变可能是有意的

在您描述的旧行为中,基本上较短的事务(即使它在较长的事务之后启动)是成功的,抢占较长的事务并导致其失败并重新尝试。实际上,这将优先考虑较短的事务

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


相比之下,新行为为所有交易提供了公平的成功机会,无论其持续时间或活动水平如何——无需优先处理。这是真的,在一个价格上——较短的交易开始于较长的交易之后,重叠的交易将花费更长的时间。我认为新的行为比旧的更可取。

您提到的文档指的是Firestore本机模式,而不是数据存储模式(我也相信您的答案)。不一样,请看@gso_gabriel我知道“如何使用事务”。因为我的代码在旧数据存储中运行良好。我理解的数据存储根据“快照隔离”控制冲突。但是数据存储模式下的Firestore不遵循该规则。嘿@stack_用户查看关于数据存储模式的文档,看起来它确实使用了可序列化隔离和事务隔离。你能检查一下我提到的这个并确认你的代码是否在这里吗?是的,我知道你教的主题。但是数据存储隔离解决方案是快照隔离。它意味着第一次提交成功,之后提交失败&重试,我想(旧数据存储就是这样做的。)使用的隔离方法可以在数据存储模式下序列化,如文件中所述。快照仅用于保存数据的状态,以防出现故障。考虑到这一点,我想说这种行为是意料之中的。@DanCornilescu你给我讲的帖子是关于“尽管entityGr在ndb中不是同一个Gr,但仍会发生冲突”。我想这是另一个话题。我的结果是使用google客户端库。如果entityGr不相同,则不会发生冲突。不应该有冲突,但报告的行为似乎会有冲突。这一解释一经发现,可能也适用于您的案例。您使用的是or吗?我使用的是。我认为GUI GCP控制台的行为似乎与此相同。(从客户端库获取、放置和休眠事务,然后GUI编辑正在等待。旧数据存储不是等待。)GUI等待给出了很好的提示-我认为这表明行为改变来自数据存储端,而不是客户端,因此与其他帖子无关。大家好,这里记录了区别:@JuanLara Read-only transactions-很好!谢谢Dan和@JuanLara!!真的很有用,很有帮助,还有文档和想法!