Вопросы довольно просты.Оптимистический контроль параллелизма в Google Datastore Transactions или нет?
Оптимистичный контроль параллелизма в Google Datastore Transactions или нет?
Одна часть документаций говорит, что он делает:
При запуске транзакции App Engine использует оптимистическое управление параллелизмом, проверяя время последнего обновления для групп сущностей, используемых в сделке. После совершения транзакции для групп сущностей App Engine снова проверяет последнее время обновления для групп сущностей, используемых в транзакции. Если он изменился с момента нашей первоначальной проверки, генерируется исключение. Source
Другая часть документации указывает на то, что он не делает:
При запуске транзакции, хранилище данных отвергает любые другие попытки записи в этой группе сущностей до завершения транзакции. Чтобы проиллюстрировать это, скажем, что у вас есть группа сущностей, состоящая из двух сущностей, одна из которых находится в корне иерархии, а другая непосредственно под ней. Если эти объекты принадлежат к отдельным группам сущностей, они могут обновляться параллельно. Но поскольку они являются частью одной и той же группы сущностей, любой запрос, пытающийся обновить один из сущностей, обязательно будет препятствовать одновременному запросу обновить любой другой объект в той же группе до тех пор, пока исходный запрос не будет завершен. Source
Как я понимаю, первая цитата говорит мне, что это прекрасно, чтобы начать транзакцию, прочитать объект и игнорировать закрытие сделки, если я не видел причин для обновления сущности.
Вторая цитата говорит мне, что если я начну транзакцию и прочитаю сущность, то я всегда должен помнить о ее закрытии, иначе я не могу запустить новое на том же объекте.
Какая часть документации верна?
BTW. В случае, если правильная цитата является второй, я использую Objectify для обработки всех моих транзакций. Не запомнит ли это все запущенные транзакции, хотя никаких изменений не было сделано?
Я использую App Engine, и хотя я не занимаюсь Java, я вполне уверен, что нельзя забыть закрыть транзакцию. Большинство вещей с appengine автоматически закрываются/завершаются, как только запрос заканчивается, было бы нецелесообразно, чтобы транзакция могла жить дальше этого - последнее предложение второй цитаты, похоже, согласуется с этим. – Greg