Questa pagina descrive come utilizzare l'isolamento di lettura ripetibile in Spanner.
La lettura ripetibile è un livello di isolamento che garantisce che tutte le operazioni di lettura all'interno di una transazione vedano uno snapshot coerente del database così com'era all'inizio della transazione. In Spanner, questo livello di isolamento viene implementato utilizzando una tecnica comunemente chiamata anche isolamento degli snapshot. Questo approccio è vantaggioso in scenari di concorrenza di lettura/scrittura elevata in cui numerose transazioni leggono dati che altre transazioni potrebbero modificare. Utilizzando uno snapshot fisso, la lettura ripetibile evita gli impatti sulle prestazioni del livello di isolamento serializzabile più rigoroso. Le letture possono essere eseguite senza acquisire blocchi e senza bloccare le scritture simultanee, il che comporta potenzialmente un numero inferiore di transazioni interrotte che potrebbero dover essere riprovate a causa di conflitti di serializzazione. Per maggiori informazioni, consulta la panoramica del livello di isolamento.
Imposta il livello di isolamento
Puoi impostare il livello di isolamento nelle transazioni di lettura/scrittura a livello di client di database o di transazione utilizzando i seguenti metodi:
Librerie client
Vai
Java
Node.js
Python
REST
Puoi utilizzare l'API REST
TransactionOptions.isolation_level
per impostare il livello di isolamento delle transazioni di lettura/scrittura e di sola lettura
a livello di transazione. Le opzioni valide sono
TransactionOptions.SERIALIZABLE e TransactionOptions.REPEATABLE_READ. Per
impostazione predefinita, Spanner imposta il livello di isolamento su serializzabile.
Limitazioni
Il seguente insieme di limitazioni esiste nell'anteprima dell'isolamento di lettura ripetibile.
- Potresti riscontrare problemi se lo schema presenta
vincoli di controllo.
- Esiste un problema noto che impedisce la convalida dei vincoli di controllo, il che può comportare violazioni dei vincoli quando vengono eseguite le transazioni. Pertanto, non è consigliabile utilizzare l'isolamento di lettura ripetibile in anteprima se lo schema ha vincoli di controllo.
- Potresti riscontrare problemi se si verificano modifiche simultanee dello schema nel tuo database durante l'esecuzione delle transazioni.
- Se le tue istruzioni DML utilizzano l'opzione
last_statemente si verifica una modifica dello schema simultanea durante l'esecuzione dell'istruzione DML, potrebbe essere eseguito un nuovo tentativo interno e restituito un errore che indica che il nuovo tentativo di esecuzione dell'istruzione DML è stato eseguito in modo errato dopo l'impostazione dell'opzionelast_statement. Se riprovi la transazione dopo l'applicazione della modifica dello schema, il problema viene risolto. - Se le richieste in una transazione riscontrano un errore
DEADLINE_EXCEEDEDdal client, riprova la transazione dopo l'applicazione della modifica dello schema per risolvere il problema.
- Se le tue istruzioni DML utilizzano l'opzione
Casi d'uso non supportati
- Non puoi impostare l'isolamento in lettura continua nelle transazioni DML partizionate.
- Tutte le transazioni di sola lettura operano già a uno snapshot fisso e non richiedono blocchi, quindi l'impostazione dell'isolamento di lettura ripetibile in questo tipo di transazione non modifica alcun comportamento.
- Non puoi impostare l'isolamento di lettura ripetibile su operazioni di sola lettura, monouso e di partizione utilizzando le librerie client Spanner. Le librerie client Spanner non avranno l'opzione per impostare l'isolamento di lettura ripetibile su operazioni di query di sola lettura, monouso e di partizione.
Passaggi successivi
Scopri di più sui livelli di isolamento.
Scopri come utilizzare SELECT FOR UPDATE nell'isolamento di lettura ripetibile.
Scopri di più sulla serializzabilità e sulla coerenza esterna di Spanner, consulta TrueTime e coerenza esterna.