2015-08-08 2 views
3

Вопросы довольно просты.Оптимистический контроль параллелизма в Google Datastore Transactions или нет?

Оптимистичный контроль параллелизма в Google Datastore Transactions или нет?

Одна часть документаций говорит, что он делает:

При запуске транзакции App Engine использует оптимистическое управление параллелизмом, проверяя время последнего обновления для групп сущностей, используемых в сделке. После совершения транзакции для групп сущностей App Engine снова проверяет последнее время обновления для групп сущностей, используемых в транзакции. Если он изменился с момента нашей первоначальной проверки, генерируется исключение. Source

Другая часть документации указывает на то, что он не делает:

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

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

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

Какая часть документации верна?

BTW. В случае, если правильная цитата является второй, я использую Objectify для обработки всех моих транзакций. Не запомнит ли это все запущенные транзакции, хотя никаких изменений не было сделано?

+2

Я использую App Engine, и хотя я не занимаюсь Java, я вполне уверен, что нельзя забыть закрыть транзакцию. Большинство вещей с appengine автоматически закрываются/завершаются, как только запрос заканчивается, было бы нецелесообразно, чтобы транзакция могла жить дальше этого - последнее предложение второй цитаты, похоже, согласуется с этим. – Greg

ответ

4

Отзывы (Greg) верны. Если вы явно закрываете транзакцию, все транзакции закрываются контейнером в конце запроса. Вы не можете «просачивать» транзакции (хотя вы можете испортить транзакции в рамках одного запроса).

Кроме того, при использовании API транзакций Objectify транзакции автоматически открываются и закрываются для вас, когда вы выполняете команду Work. Вы сами не управляете транзакциями.

Чтобы ответить на ваш корень вопроса: Да, все транзакции в хранилище данных GAE оптимистичны. В хранилище нет пессимистической блокировки; вы можете запустить столько транзакций, сколько хотите, в одной группе сущностей, но только первая фиксация будет успешной. Все последующие попытки совершить будут откатываться с ConcurrentModificationException.

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