Esta página descreve como usar o isolamento de leitura repetível no Spanner.
A leitura repetível é um nível de isolamento que garante que todas as operações de leitura numa transação veem um instantâneo consistente da base de dados tal como existia no início da transação. No Spanner, este nível de isolamento é implementado através de uma técnica que também é comummente denominada isolamento de instantâneo. Esta abordagem é vantajosa em cenários de concorrência de leitura/escrita elevada em que várias transações leem dados que outras transações podem estar a modificar. Ao usar uma captura instantânea fixa, a leitura repetível evita os impactos no desempenho do nível de isolamento serializável mais rigoroso. As leituras podem ser executadas sem adquirir bloqueios e sem bloquear escritas simultâneas, o que resulta potencialmente em menos transações anuladas que podem ter de ser repetidas devido a conflitos de serialização. Para mais informações, consulte o artigo Vista geral do nível de isolamento.
Defina o nível de isolamento
Pode definir o nível de isolamento em transações de leitura/escrita ao nível do cliente da base de dados ou ao nível da transação através dos seguintes métodos:
Bibliotecas cliente
Ir
Java
Node.js
Python
REST
Pode usar a
TransactionOptions.isolation_level
API REST para definir o nível de isolamento em transações de leitura/escrita e só de leitura
ao nível da transação. As opções válidas são
TransactionOptions.SERIALIZABLE e TransactionOptions.REPEATABLE_READ. Por predefinição, o Spanner define o nível de isolamento como isolamento serializável.
Limitações
O seguinte conjunto de limitações existe na pré-visualização do isolamento de leitura repetível.
- Pode ter problemas se o seu esquema tiver
restrições de verificação.
- Existe um problema conhecido que impede a validação das restrições de verificação, o que pode resultar em violações de restrições quando as transações são confirmadas. Por conseguinte, não recomendamos a utilização do isolamento de leitura repetível na pré-visualização se o seu esquema tiver restrições de verificação.
- Pode ter problemas se ocorrerem alterações de esquema simultâneas na sua base de dados enquanto as transações estão a ser executadas.
- Se as suas declarações DML usarem a opção
last_statemente ocorrer uma alteração de esquema simultânea enquanto a declaração DML é executada, pode tentar novamente internamente e devolver um erro a indicar que a DML foi tentada novamente incorretamente após a definição da opçãolast_statement. Voltar a tentar a transação depois de a alteração do esquema ser aplicada resolve este problema. - Se os pedidos numa transação tiverem um erro
DEADLINE_EXCEEDEDdo cliente, tente novamente a transação depois de a alteração do esquema ser aplicada para resolver o problema.
- Se as suas declarações DML usarem a opção
Exemplos de utilização não suportados
- Não pode definir o isolamento de leitura repetível em transações DML particionadas.
- Todas as transações só de leitura já funcionam num instantâneo fixo e não requerem bloqueios, pelo que a definição do isolamento de leitura repetível neste tipo de transação não altera nenhum comportamento.
- Não pode definir o isolamento de leitura repetível em operações de leitura, de utilização única e de partição através das bibliotecas de cliente do Spanner. As bibliotecas de cliente do Spanner não têm a opção de definir o isolamento de leitura repetível em operações de leitura, de utilização única e de consulta de partição.
O que se segue?
Saiba mais sobre os níveis de isolamento.
Saiba como usar SELECT FOR UPDATE no isolamento de leitura repetível.
Para saber mais sobre a serialização e a consistência externa do Spanner, consulte o artigo TrueTime e consistência externa.