Вам действительно не нужно беспокоиться об обработке количества песен пользователя, которые он прокомментировал в транзакции, потому что кажется маловероятным, что пользователь сможет комментировать более одной песни одновременно, верно?
Теперь, безусловно, многие пользователи могут комментировать одну и ту же песню одновременно, поэтому вам нужно побеспокоиться о том, чтобы данные не были признаны недействительными из-за состояния гонки.
Однако, если вы будете вести подсчет количества пользователей, которые прокомментировали песню внутри сущности Song, и заблокируете сущность транзакцией, вы получите очень высокую конкуренцию за эту сущность, и тайм-ауты хранилища данных Ваше приложение имеет много проблем.
Этот ответ для этой проблемы: Sharded Counter .
Чтобы удостовериться, что вы можете создать новую сущность SongUser и обновить счётчик связанной песни, вы должны рассмотреть вопрос о том, чтобы сущность SongUser имела связанную песню в качестве родителя. Это поместит их в одну группу сущностей, и вы можете создать SongUser и обновить счетчик сегментированных в одной транзакции. Отношения SongUser с пользователем, который его создал, могут храниться в ReferenceProperty.
Что касается вашего беспокойства по поводу того, что два обновления (транзакционное и пользовательское обновление) не оба завершаются успешно, это всегда возможно, но, учитывая, что любое обновление может завершиться неудачно, вам потребуется надлежащая обработка исключений, чтобы гарантировать, что оба добиться успеха. Это важный момент: обновления в транзакциях не гарантируются. Вы можете получить исключение TransactionfailedError, если транзакция не может быть завершена по какой-либо причине.
Итак, если ваша транзакция завершается без выдачи исключения, запустите обновление для пользователя в транзакции. Это даст вам автоматическую повторную попытку обновления для пользователя, если произойдет какая-либо ошибка. Если что-то о возможном конфликте в сущности User не существует, что я не понимаю, вероятность того, что он в конечном итоге не будет успешным, чрезвычайно мала . Если это неприемлемый риск, то я не думаю, что у AppEngine есть для вас идеальное решение этой проблемы.
Сначала спросите себя: неужели так плохо, если количество песен, которые кто-то прокомментировал, уменьшается на единицу? Это так же важно, как обновление баланса банковского счета или продажа акций?