Как выполнить это в обновлении в Go? (Google App Engine) - PullRequest
1 голос
/ 06 февраля 2012

Мне нужно обновить сущность хранилища данных таким образом, чтобы несколько одновременных пользователей не делали одно и то же.
Я понимаю, что не могу использовать SQL для обновления хранилища данных, но я не уверен, что еще будет работать.

Вот как я мог бы добиться этого в СУБД с использованием SQL:

-- 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 ]

2 голосов
/ 07 февраля 2012

Транзакции могут использоваться для атомарного выполнения последовательности операций с хранилищем данных.

0 голосов
/ 06 февраля 2012

Мое решение следующее:

В конце концов я понял, что, если я обновлю баланс и дату проверки одновременно, все будет хорошо. Параллельные обновления ничего не сломают:)

Но я все равно думал, что выложу!

Я все еще рад видеть лучшие решения ...

...