Problemas de contención en Google App Engine

Tengo problemas de contención en Google App Engine y trato de entender lo que está sucediendo.

Tengo un controlador de solicitud anotado con:

@ndb.transactional(xg=True, retries=5) 

... y en ese código busco algunas cosas, actualizo otras, etc. Pero a veces aparece un error como este en el registro durante una solicitud:

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"
    }
  >
  )

... seguido por un rastro de pila. Puedo actualizar con todo el seguimiento de la pila si es necesario, pero es un poco largo.

No entiendo por qué sucede esto. Mirando la línea en mi código, llega la excepción, corroget_by_id en una entidad totalmente diferente (Ronda). El "PlayerGameStates", nombre "hannes2" que se menciona en los mensajes de error es el padre de otra entidad GameState, que ha sidoget_async: ed de la base de datos unas pocas líneas antes;

# GameState is read by get_async
gamestate_future = GameState.get_by_id_async(id, ndb.Key('PlayerGameStates', player_key))
...
gamestate = gamestate_future.get_result()
...

Lo extraño (?) Es que no hay escrituras en el almacén de datos para esa entidad. Tengo entendido que pueden producirse errores de contención si la misma entidad se actualiza al mismo tiempo, en paralelo ... O tal vez si se producen demasiadas escrituras, en un corto período de tiempo ...

Pero, ¿puede suceder al leer entidades también? ("generador suspendido get .." ??) Y, ¿está sucediendo esto después de los 5 reintentos de transacción ndb ..? No puedo ver nada en el registro que indique que se han realizado reintentos.

Cualquier ayuda es muy apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta