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 que também é comumente 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 de 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 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/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
TransactionOptions.isolation_level
API REST 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
O conjunto de limitações a seguir existe no pré-lançamento do isolamento de leitura repetível.
- 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 no pré-lançamento se o esquema tiver restrições de verificação.
- Você pode ter problemas se mudanças simultâneas de esquema ocorrerem no banco de dados enquanto as transações estão sendo executadas.
- Se as instruções DML usarem a
last_statementopção e uma mudança de esquema simultânea ocorrer enquanto a instrução DML for executada, ela poderá tentar novamente internamente e retornar um erro informando que a DML foi repetida incorretamente após alast_statementopção ser definida. Repetir a transação após a aplicação da mudança de esquema resolve esse problema. - Se as solicitações em uma transação tiverem um erro
DEADLINE_EXCEEDEDdo cliente, repita a transação após a aplicação da mudança de esquema para resolver o problema.
- Se as instruções DML usarem a
Casos de uso não aceitos
- Não é possível definir o isolamento de leitura repetível em transações DML particionadas.
- Todas as transações somente leitura já operam em um snapshot fixo e não exigem bloqueios. Portanto, a definição do 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.
Aprenda a usar SELECT FOR UPDATE no isolamento de leitura repetível.
Para saber mais sobre a capacidade de serialização e a consistência externa do Spanner, consulte TrueTime e consistência externa.