Если это неправильно, то я не хочу быть правым!
На самом деле нет. Это не правильно. Майкл хорошо объяснил: в лучшем случае это делает ваше приложение не очень перспективным, а в худшем случае вы получите серьезные ошибки, которые вынудят вас перестроить в неудобное время.
Рассмотрим Google App Engine. Каков их предполагаемый образец транзакции?
- Начать транзакцию
- Получить ваши сущности по ключу
- Изменить сущности и сохранить их
- Завершение транзакции
Они формируют функцию, которая повторно запускается в случае сбоя транзакции. Зачем? И почему выборка должна быть внутри транзакции, а не зависать во внешней области видимости?
Потому что App Engine использует MVCC для внутреннего использования. Если вы получили коллизию (ваша ревизия неверна, потому что кто-то другой обновил), тогда они просто перезапустят вашу функцию. Следующая итерация извлечет более новую ревизию, обновит из более новых данных и вернет с правильной ревизией. Дело в том, что Google не предоставляет это пользователям, потому что это не подходящая среда для создания версий на уровне приложений.