如何在Go中更新中执行此操作? (Google App Engine)

时间:2012-02-06 13:57:34

标签: google-app-engine google-cloud-datastore go

我需要以不会被多个并发用户做同样事情的方式更新数据存储区实体。
我知道我不能使用SQL来更新数据存储区,但我不确定还有什么可行。

这是我在使用SQL的RDBMS中实现它的方法:

-- Account.Balance   = current balance
-- Account.Rate      = increase per second
-- Account.CheckDate = the last time the balance was checked and updated

-- so we need to find the number of seconds since the last check, 
-- update the balance by rate*seconds, then update the check datetime

UPDATE    Account
SET       Account.Balance = Account.Balance + ( DATEDIFF(S, GETDATE(), Account.CheckDate) * Account.Rate),
          Account.CheckDate = GETDATE()

我知道我可以在一个事务中包装所有操作,但是如何确保更新不会因为多个用户没有使用像所示的SQL那样的单个更新操作而计算错误?
你可能会看到几个操作,如:

1. Read entity
2. Update values
3. Save entity
由于多个用户做同样的事情,

可能会失败

我猜有几种可能的方法来实现这一目标,我正在寻找能够最好地满足这一要求和未来需求的方法。

==================答案==================

当我达到这一点时,我意识到只要我同时更新余额和检查日期,一切都会好的。 并发更新不会破坏任何东西:)

但我还以为我会发布它!

我仍然很高兴看到更好的解决方案......

2 个答案:

答案 0 :(得分:2)

Transactions可用于原子地执行一系列数据存储操作。

答案 1 :(得分:0)

我的解决方案如下:

我终于意识到,只要我同时更新余额和支票日期,一切都会好的。并发更新不会破坏任何东西:)

但我还以为我会发布它!

我仍然很高兴看到更好的解决方案......