2012-02-06 3 views
1

Мне нужно обновить объект хранилища данных таким образом, который не будет нарушен несколькими одновременными пользователями, делающими то же самое.
Я понимаю, что я не могу использовать SQL для обновления хранилища данных, но я не уверен, что еще будет работать.Как это сделать в обновлении в Go? (Google App Engine)

Это, как я бы добиться этого в СУБД с помощью 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 

может потерпеть неудачу из-за нескольких пользователей, делающих то же самое

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

================== ОТВЕТ ==================

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

Но я думал, что опубликую его в любом случае!

Я до сих пор рад видеть лучшие решения, хотя ...

+1

Hi bukko! На SO предпочтительно, чтобы вы отправляли свой ответ отдельно вместо обновления вопроса. Вы также можете пометить свой собственный ответ как принятый, если вы удовлетворены его. Хорошего дня! – Ski

+0

Конечно, извините, выложили ответ ниже! – CompanyDroneFromSector7G

ответ

2

Transactions может быть использован для атомарно выполнить последовательность операций хранилища данных.

0

Мое решение следующим образом:

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

Но я думал, что я бы опубликовал его в любом случае!

Я до сих пор рад видеть лучшие решения, хотя ...

Смежные вопросы