如何更新Google Cloud Datastore上的交易中的帐户余额

时间:2016-11-16 20:37:20

标签: transactions google-cloud-datastore

我正在设计我的数据存储区的布局,但我想知道由于交易的性质,我的方法是否正确。

我有一个Account实体:

Account
=======
(int) balance (in cents)

和转移实体:

Transfer
========
(Key) fromAccount
(Key) toAccount
(int) amount (in cents)

现在转移非常简单:
在一个事务中,我插入一个Transfer实体,其中包含适当的值(fromAccounttoAccountamount),并使用正确的更新两个Account实体balance

到目前为止一切顺利。但文档中写道:

  

当两个或多个事务同时尝试修改一个或多个公共实体组中的实体时,只有提交其更改的第一个事务才能成功;所有其他人都会在提交时失败。

这不是一个大问题吗?如果我同时发生多次转移,他们可能都希望更新相同的Account,以便它们都会失败。

建议的方法是什么?

编辑:在文档中,他们讨论了重试相同的事务,但如果我在一个帐户上有太多的写操作,这只会导致无休止的重试?

1 个答案:

答案 0 :(得分:2)

如果多个事务正在尝试更新给定实体,则只有其中一个事务成功。您没有选择,只能立即或在延迟一段时间后重试失败的传输。

我不确定您的具体用例是什么,以及为什么您要从单个帐户进行多次同时转移。但如果这是您需要解决的问题,一种解决方案可能是批量处理转移。您可以对传输进行排队并处理队列,也可以使用状态为“待定/已完成”的转移种类,并依次处理实体。

关于重试和永不停止的重试 - 它取决于为单个帐户进入的新传输请求的数量。如果新请求的速度高于您能够处理的速率,则会出现问题。否则,它不应该是一个问题,因为你一次只提交一个事务,最终所有事情都将完成。

如果您分享更多详细信息(例如预计每小时/每天的总转移次数,同时转移到/来自单个帐户),社区可能会建议其他选项。

相关问题