Uma transação é um conjunto de operações numa ou mais entidades. Cada transação tem a garantia de ser atómica, o que significa que as transações nunca são aplicadas parcialmente. Todas as operações na transação são aplicadas ou nenhuma delas é aplicada.
Usar transações
As transações expiram após 270 segundos ou se estiverem inativas durante 60 segundos.
Uma operação pode falhar quando:
- Foram tentadas demasiadas modificações simultâneas na mesma entidade.
- A transação excede um limite de recursos.
- A base de dados do modo Datastore encontra um erro interno.
Em todos estes casos, a API Datastore devolve um erro.
As transações são uma funcionalidade opcional. Não tem de usar transações para realizar operações na base de dados.
Uma aplicação pode executar um conjunto de declarações e operações numa única transação, de modo que, se qualquer declaração ou operação gerar uma exceção, nenhuma das operações da base de dados no conjunto é aplicada. A aplicação define as ações a realizar na transação.
O fragmento seguinte mostra como realizar uma transação. Transfere dinheiro de uma conta para outra.
C#
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API C# Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Go Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Java Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Node.js Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API PHP Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Python Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Ruby Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Tenha em atenção que, para manter os nossos exemplos mais concisos, por vezes, omitimos o elemento rollback
se a transação falhar. No código de produção, é importante garantir que cada transação é explicitamente confirmada ou revertida.
O que pode ser feito numa transação
As transações podem consultar ou procurar qualquer número de entidades. O tamanho máximo de uma transação é de 10 MiB. Pode usar uma transação de leitura/escrita ou uma transação de só leitura.
Isolamento e consistência
As bases de dados do modo Datastore aplicam o isolamento serializável. Os dados lidos ou modificados por uma transação não podem ser modificados em simultâneo.
As consultas e as pesquisas numa transação veem um resumo consistente do estado da base de dados. Este resumo tem a garantia de conter o efeito de todas as transações e gravações concluídas antes do início da transação.
Esta vista de instantâneo consistente também se aplica a leituras após escritas em transações. Ao contrário da maioria das bases de dados, as consultas e as pesquisas numa transação do modo Datastore não veem os resultados das escritas anteriores nessa transação. Especificamente, se uma entidade for modificada ou eliminada numa transação, uma consulta ou uma pesquisa devolve a versão original da entidade a partir do início da transação ou nada, se a entidade não existir nesse momento.
Fora das transações, as consultas e as pesquisas também têm isolamento serializável.
Modos de simultaneidade
O Firestore no modo Datastore suporta três modos de simultaneidade. O modo de concorrência é uma definição da base de dados que determina como as transações concorrentes interagem. Pode selecionar um dos seguintes modos de concorrência:
Pessimistic
As transações de leitura/escrita usam bloqueios de leitor/escritor para aplicar o isolamento e a serialização. Quando duas ou mais transações de leitura/escrita simultâneas leem ou escrevem os mesmos dados, o bloqueio mantido por uma transação pode atrasar as outras transações. Se a sua transação não exigir gravações, pode melhorar o desempenho e evitar contestações com outras transações através de uma transação só de leitura. As transações só de leitura não requerem bloqueios.
As bases de dados do Firestore no modo Datastore usam o modo de concorrência pessimista por predefinição.
Otimista
Quando duas ou mais transações de leitura/escrita simultâneas leem ou escrevem os mesmos dados, apenas a primeira transação a confirmar as respetivas alterações é bem-sucedida. Outras transações que executam escritas falham na confirmação.
Otimista com grupos de entidades
Use este modo de simultaneidade apenas se a sua app depender da semântica transacional do grupo de entidades do Cloud Datastore antigo. Este modo de concorrência impõe limites adicionais às transações:
- As transações estão limitadas a 25 grupos de entidades.
- As escritas num grupo de entidades estão limitadas a 1 por segundo.
- As consultas em transações têm de ser consultas antecessoras.
Para remover as limitações de débito de
OPTIMISTIC_WITH_ENTITY_GROUPS
consultas, transações e escrita, altere o modo de simultaneidade do seu projeto para Otimista. Para garantir que esta alteração é compatível com o seu projeto:Crie um projeto de teste no Firestore no modo Datastore.
Altere o modo de simultaneidade do projeto de teste para
OPTIMISTIC
. Emita um pedido HTTP PATCH, conforme demonstrado abaixo.Execute testes no projeto de teste para garantir que a carga de trabalho tem o desempenho esperado sem grupos de entidades.
Altere o modo de simultaneidade do projeto principal de
OPTIMISTIC_WITH_ENTITY_GROUPS
paraOPTIMISTIC
.
Veja o modo de simultaneidade
Use o recurso REST projects.databases do Firestore para ver o modo de simultaneidade da sua base de dados:
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
Altere o modo de simultaneidade
Para alterar o modo de simultaneidade da sua base de dados, envie um pedido PATCH
para o recurso REST
projects.databases:
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
where:
- CONCURRENCY_MODE é
PESSIMISTIC
,OPTIMISTIC
ouOPTIMISTIC_WITH_ENTITY_GROUPS
. - PROJECT_ID é o ID do seu Google Cloud projeto.
Usos para transações
Uma utilização das transações é atualizar uma entidade com um novo valor de propriedade relativo ao seu valor atual. O transferFunds
exemplo acima faz isso para duas entidades, retirando dinheiro de uma conta e transferindo-o para outra.
A API Datastore não tenta novamente as transações automaticamente, mas pode adicionar a sua própria lógica para as tentar novamente, por exemplo, para processar conflitos quando outro pedido atualiza a mesma entidade ao mesmo tempo.
C#
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API C# Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Go Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Java Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Node.js Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API PHP Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Python Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Ruby Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Isto requer uma transação porque o valor de balance
numa entidade pode ser atualizado por outro utilizador depois de este código obter o objeto, mas antes de guardar o objeto modificado. Sem uma transação, o pedido do utilizador usa o valor de balance
antes da atualização do outro utilizador, e a gravação substitui o novo valor. Com uma transação, a aplicação é informada sobre a atualização do outro utilizador.
Outra utilização comum das transações é obter uma entidade com uma chave com nome ou criá-la se ainda não existir (este exemplo baseia-se no exemplo TaskList de criar uma entidade):
C#
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API C# Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Go Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Java Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Node.js Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API PHP Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Python Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Ruby Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Tal como antes, é necessária uma transação para processar o caso em que outro utilizador está a tentar criar ou atualizar uma entidade com o mesmo ID de string. Sem uma transação, se a entidade não existir e dois utilizadores tentarem criá-la, o segundo substitui o primeiro sem saber que isso aconteceu.
Quando uma transação falha, pode fazer com que a sua app tente novamente a transação até ter êxito ou pode permitir que os utilizadores lidem com o erro propagando-o ao nível da interface do utilizador da sua app. Não tem de criar um ciclo de repetição em torno de cada transação.
Transações só de leitura
Por último, pode usar uma transação para ler uma imagem consistente da base de dados. Isto pode ser útil quando precisa de várias leituras para renderizar uma página ou para exportar dados que têm de ser consistentes. Pode criar uma transação só de leitura para estes casos.
As transações só de leitura não podem modificar entidades, mas, em contrapartida, não competem com outras transações e não precisam de ser repetidas. Se realizar apenas leituras numa transação de leitura/escrita normal, essa transação pode competir com transações que modificam os mesmos dados.
C#
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API C# Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Go Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Java Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Node.js Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API PHP Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Python Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca cliente do Cloud Datastore, consulte as bibliotecas cliente do Cloud Datastore. Para mais informações, consulte a documentação de referência da API Ruby Cloud Datastore.
Para se autenticar no Cloud Datastore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
O que se segue?
- Saiba mais sobre as consultas.