Pergunta

no meu aplicativo google app, sempre que um usuário compra um número de contratos, esses eventos são executados (simplificado para maior clareza):

  • user.cash é diminuída
  • user.contracts é aumentado pelo número
  • contracts.current_price é atualizado.
  • market.no_of_transactions é aumentado em 1.

em um RDMS, estes seriam colocados dentro da mesma transação. Eu concebo que o Google armazenamento de dados não permite que entidades de mais de um modelo a ser na mesma transação.

qual é a abordagem correta para esta questão? Como posso garantir que, se uma gravação falhar, todas as gravações anteriores são revertidas?

edit: eu, obviamente, perdeu grupos de entidade. Agora eu apreciaria algumas informações a respeito de como eles são usados. Outro ponto a esclarecer é google diz "Somente grupos de entidade usar quando eles são necessários para transações. Para outros relacionamentos entre entidades, propriedades de uso ReferenceProperty e valores-chave, que podem ser usados ??em consultas". que significa que eu tenho que definir tanto uma propriedade de referência (desde que eu preciso queriying eles) e uma relação pai-filho (para transações)?

Editar 2: e, finalmente, como faço para definir dois pais para uma entidade se a entidade está sendo criada para estabelecer um n-para-n relação entre 2 pais

Foi útil?

Solução

Depois de um meio de pesquisa, eu descobri que uma camada de transação distribuída que fornece uma solução para a restrição de grupo de entidades único foi desenvolvido em userland com a ajuda de alguns google pessoas. Mas, até agora, não é liberado e está disponível apenas em Java.

Outras dicas

Deixe-me acrescentar uma citação do Datastore :

Uma boa regra de ouro para grupos de entidade é que eles devem ser sobre o tamanho da pena de um único usuário de dados ou menor.

Você poderia criar uma entidade raiz pseudo e colocar tudo abaixo deste. Em seguida, você executar tudo em uma transação.

Shanyu, você mencionou a camada de transação distribuída que permite operar em toda arbitrariamente muitos grupos de entidade em uma única transação. ele realmente foi lançado , ele só não foi anunciado muito alto. como foi concebido e escrito por Daniel Wilkerson e erick armbrust, com alguma consultoria da minha parte. dan descreve em essa conversa .

Nick Johnson também descreveu como fazer operações do tipo "transferência" entre grupos de entidades , semelhante ao que você descreve. não é como propósito geral como tapioca-ORM, mas é mais simples e mais leve.

há um relacionadas construído na característica, transacionais tarefas , que permite adicionar uma tarefa a uma fila dentro de uma transação de armazenamento de dados, de tal forma que ele só será adicionado se a transação será confirmada com sucesso. essa tarefa pode então fazer mais do armazenamento de dados de operações, incluindo uma transação em um grupo de entidades diferentes. não é tão forte como solução dan e erick do, mas dá-lhe garantida a consistência eventual entre grupos de entidades, o que é bom o suficiente para muitos casos de uso, sem a sobrecarga extra.

em resposta a suas perguntas: 1) você não é obrigado a usar ambas as propriedades de referência e relações pai / filho (ou seja, grupos de entidade). essa orientação apenas significa que os grupos de entidades limitar armazenamento de dados de transferência de gravação, uma vez que as gravações são serializado por grupo de entidades. você deve estar ciente de que se você está pensando em estruturar seus dados em grupos de entidade apenas para ancestral consultas.

2) uma entidade não pode ter mais de um pai. se você quer modelar um relacionamento muitos-para-muitos, geralmente você deve usar um ListProperty de propriedades de referência (ou seja, teclas). consulte este artigo e este conversa para mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top