Мне нужно обновить объект хранилища данных таким образом, который не будет нарушен несколькими одновременными пользователями, делающими то же самое.
Я понимаю, что я не могу использовать 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
может потерпеть неудачу из-за нескольких пользователей, делающих то же самое
Я предполагаю, что есть несколько возможных путей достижения этой цели, и я ищу тот, который лучше всего подходит для этого и будущих потребностей.
================== ОТВЕТ ==================
Когда я получил это Я понял, что до тех пор, пока я обновляю баланс и дату проверки одновременно, все будет хорошо. Параллельные обновления ничего не сломают :)
Но я думал, что опубликую его в любом случае!
Я до сих пор рад видеть лучшие решения, хотя ...
Hi bukko! На SO предпочтительно, чтобы вы отправляли свой ответ отдельно вместо обновления вопроса. Вы также можете пометить свой собственный ответ как принятый, если вы удовлетворены его. Хорошего дня! – Ski
Конечно, извините, выложили ответ ниже! – CompanyDroneFromSector7G