Nesta página, descrevemos 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 em uma transação vejam um snapshot consistente do banco de dados como ele existia no início da transação. No Spanner, esse nível de isolamento é implementado usando uma técnica também chamada de isolamento de snapshot. Essa abordagem é benéfica em cenários de alta simultaneidade de leitura/gravação em que várias transações leem dados que outras transações podem estar modificando. Ao usar um snapshot fixo, 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 gravações simultâneas, o que resulta em potencialmente menos transações anuladas que podem precisar ser repetidas devido a conflitos de serialização. Para mais informações, consulte Visão geral do nível de isolamento.
Definir o nível de isolamento
É possível definir o nível de isolamento em transações de leitura e gravação no nível do cliente do banco de dados ou da transação usando os seguintes métodos:
Bibliotecas de cliente
Go
Java
Node.js
Python
REST
É possível usar a
API REST TransactionOptions.isolation_level
para definir o nível de isolamento em transações de leitura/gravação e somente leitura
no nível da transação. As opções válidas são TransactionOptions.SERIALIZABLE e TransactionOptions.REPEATABLE_READ. Por padrão, o Spanner define o nível de isolamento como isolamento serializável.
Limitações
As seguintes limitações existem no pré-lançamento do isolamento de leitura repetida.
- Você pode ter problemas se o esquema tiver restrições de verificação.
- Há um problema conhecido que impede a validação das restrições de verificação, o que pode resultar em violações de restrição quando as transações são confirmadas. Portanto, não recomendamos o uso do isolamento de leitura repetível na prévia se o esquema tiver restrições de verificação.
- Você pode ter problemas se houver mudanças simultâneas no esquema do banco de dados enquanto as transações estão sendo executadas.
- Se as instruções DML usarem a
opção
last_statemente uma mudança de esquema simultânea ocorrer durante a execução da instrução DML, ela poderá tentar novamente internamente e retornar um erro informando que a DML foi tentada novamente incorretamente depois que a opçãolast_statementfoi definida. Tentar de novo a transação depois que a mudança de esquema for aplicada resolve esse problema. - Se as solicitações em uma transação apresentarem um erro
DEADLINE_EXCEEDEDdo cliente, tente novamente a transação depois que a mudança de esquema for aplicada para resolver o problema.
- Se as instruções DML usarem a
opção
Casos de uso não aceitos
- Não é possível definir o isolamento de leitura repetível em transações de DML particionadas.
- Todas as transações somente leitura já operam em um snapshot fixo e não exigem bloqueios. Portanto, definir o isolamento de leitura repetível nesse tipo de transação não muda nenhum comportamento.
- Não é possível definir o isolamento de leitura repetível em operações somente leitura, de uso único e de partição usando as bibliotecas de cliente do Spanner. As bibliotecas de cliente do Spanner não terão a opção de definir o isolamento de leitura repetível em operações de consulta somente leitura, de uso único e de partição.
A seguir
Saiba mais sobre os níveis de isolamento.
Saiba como usar SELECT FOR UPDATE no isolamento de leitura repetível.
Saiba mais sobre a capacidade de serialização e a consistência externa do Spanner em TrueTime e consistência externa.