У меня проблемы с конкуренцией в Google App Engine, и я пытаюсь понять, что происходит.
У меня есть обработчик запросов, помеченный:
@ndb.transactional(xg=True, retries=5)
..и в этом коде я получаю кое-что, кое-что обновляю и т. д. Но иногда такая ошибка появляется в журнале во время запроса:
16:06:20.930 suspended generator _get_tasklet(context.py:329) raised TransactionFailedError(too much contention on these datastore entities. please try again. entity group key: app: "s~my-appname"
path <
Element {
type: "PlayerGameStates"
name: "hannes2"
}
>
)
16:06:20.930 suspended generator get(context.py:744) raised TransactionFailedError(too much contention on these datastore entities. please try again. entity group key: app: "s~my-appname"
path <
Element {
type: "PlayerGameStates"
name: "hannes2"
}
>
)
16:06:20.930 suspended generator get(context.py:744) raised TransactionFailedError(too much contention on these datastore entities. please try again. entity group key: app: "s~my-appname"
path <
Element {
type: "PlayerGameStates"
name: "hannes2"
}
>
)
16:06:20.936 suspended generator transaction(context.py:1004) raised TransactionFailedError(too much contention on these datastore entities. please try again. entity group key: app: "s~my-appname"
path <
Element {
type: "PlayerGameStates"
name: "hannes2"
}
>
)
... сопровождаемый трассировкой стека. При необходимости я могу обновить всю трассировку стека, но это довольно долго.
Я не понимаю, почему это происходит. Глядя на строку в моем коде, возникает исключение, я запускаю get_by_id
на совершенно другом объекте (Round). «PlayerGameStates», имя «hannes2», которое упоминается в сообщениях об ошибках, является родительским элементом другого объекта GameState, который был get_async
: ed из базы данных несколькими строками ранее;
# GameState is read by get_async
gamestate_future = GameState.get_by_id_async(id, ndb.Key('PlayerGameStates', player_key))
...
gamestate = gamestate_future.get_result()
...
Странная (?) Вещь в том, что для этой сущности не происходит записи в хранилище данных. Насколько я понимаю, конфликтные ошибки могут возникать, если один и тот же объект обновляется одновременно, параллельно .. Или, может быть, если происходит слишком много операций записи за короткий период времени ..
Но может ли это случиться и при чтении сущностей? ("приостановленный генератор получить .." ??) И это происходит после 5 попыток транзакции ndb.transaction ..? Я не вижу в журнале ничего, что указывало бы на то, что были сделаны какие-либо повторные попытки.
Любая помощь приветствуется.
ndb.Key("PlayerGameStates", "hannes2")
, верно? Я до сих пор не понимаю, почему чтение из него вызывает исключение / конфликт? Где я могу узнать об этом подробнее ..? - person boffman   schedule 04.10.2015