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

Posted

技术标签:

【中文标题】如何在 Google Cloud Datastore 上更新交易中的帐户余额【英文标题】:How to update an account balance in transaction on Google Cloud Datastore 【发布时间】:2017-03-31 05:22:51 【问题描述】:

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

我有一个Account 实体:

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

和一个转移实体:

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

现在转移很容易: 在事务中,我插入了一个具有适当值(fromAccounttoAccountamount)的Transfer 实体,并使用正确的balance 更新了两个Account 实体。

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

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

这不会造成大问题吗?如果我有许多个传输同时发生,他们可能都想更新同一个Account,所以他们都会失败。

为此推荐的方法是什么?

编辑:在文档中,他们谈到重试同一事务,但如果我对一个帐户进行太多写入操作,这只会导致无休止的重试,不是吗?

【问题讨论】:

【参考方案1】:

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

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

关于重试和永无止境的重试 - 这取决于单个帐户收到的新转移请求的数量。如果新请求的速度高于您能够处理的速度,那将是一个问题。否则,这应该不是问题,因为您将一次提交一个事务,最终一切都会完成。

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

【讨论】:

谢谢。这就是我的想法。从计数器的示例(文档中提供)中,我还看到,在单个实体需要多次更新的情况下,“分片”就是答案。

以上是关于如何在 Google Cloud Datastore 上更新交易中的帐户余额的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Cloud TPU 训练 keras 模型

如何在 Google Cloud Functions 和 Google App Engine 之间进行选择?

如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?

如何在 Chrome 中实现 Google Cloud Messaging - Topic Messaging?

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?

如何在 Google Cloud Endpoints 中允许 CORS?