我正在设计我的数据存储区的布局,但我想知道由于交易的性质,我的方法是否正确。
我有一个Account
实体:
Account
=======
(int) balance (in cents)
和转移实体:
Transfer
========
(Key) fromAccount
(Key) toAccount
(int) amount (in cents)
现在转移非常简单:
在一个事务中,我插入一个Transfer
实体,其中包含适当的值(fromAccount
,toAccount
,amount
),并使用正确的更新两个Account
实体balance
。
到目前为止一切顺利。但文档中写道:
当两个或多个事务同时尝试修改一个或多个公共实体组中的实体时,只有提交其更改的第一个事务才能成功;所有其他人都会在提交时失败。
这不是一个大问题吗?如果我同时发生多次转移,他们可能都希望更新相同的Account
,以便它们都会失败。
建议的方法是什么?
编辑:在文档中,他们讨论了重试相同的事务,但如果我在一个帐户上有太多的写操作,这只会导致无休止的重试?
答案 0 :(得分:2)
如果多个事务正在尝试更新给定实体,则只有其中一个事务成功。您没有选择,只能立即或在延迟一段时间后重试失败的传输。
我不确定您的具体用例是什么,以及为什么您要从单个帐户进行多次同时转移。但如果这是您需要解决的问题,一种解决方案可能是批量处理转移。您可以对传输进行排队并处理队列,也可以使用状态为“待定/已完成”的转移种类,并依次处理实体。
关于重试和永不停止的重试 - 它取决于为单个帐户进入的新传输请求的数量。如果新请求的速度高于您能够处理的速率,则会出现问题。否则,它不应该是一个问题,因为你一次只提交一个事务,最终所有事情都将完成。
如果您分享更多详细信息(例如预计每小时/每天的总转移次数,同时转移到/来自单个帐户),社区可能会建议其他选项。