En esta página se describe cómo usar el aislamiento de lectura repetible en Spanner.
La lectura repetible es un nivel de aislamiento que asegura que todas las operaciones de lectura de una transacción vean una captura coherente de la base de datos tal como estaba al inicio de la transacción. En Spanner, este nivel de aislamiento se implementa mediante una técnica que también se suele denominar aislamiento de instantánea. Este enfoque es útil en situaciones de alta simultaneidad de lectura y escritura en las que numerosas transacciones leen datos que otras transacciones podrían estar modificando. Al usar una instantánea fija, la lectura repetible evita los efectos en el rendimiento del nivel de aislamiento serializable, que es más riguroso. Las lecturas se pueden ejecutar sin adquirir bloqueos y sin bloquear las escrituras simultáneas, lo que puede dar lugar a menos transacciones abortadas que deban volver a intentarse debido a conflictos de serialización. Para obtener más información, consulta la descripción general de los niveles de aislamiento.
Definir el nivel de aislamiento
Puede definir el nivel de aislamiento en las transacciones de lectura y escritura a nivel de cliente de la base de datos o a nivel de transacción mediante los siguientes métodos:
Bibliotecas de cliente
Go
Java
Node.js
Python
REST
Puedes usar la API REST TransactionOptions.isolation_level para definir el nivel de aislamiento en las transacciones de lectura y escritura y de solo lectura a nivel de transacción. Las opciones válidas son TransactionOptions.SERIALIZABLE y TransactionOptions.REPEATABLE_READ. De forma predeterminada, Spanner define el nivel de aislamiento en aislamiento serializable.
Limitaciones
La versión preliminar de aislamiento de lectura repetible tiene las siguientes limitaciones.
- Es posible que tengas problemas si tu esquema tiene restricciones de comprobación.
- Hay un problema conocido que impide que se validen las restricciones de comprobación, lo que puede provocar infracciones de restricciones cuando se confirman las transacciones. Por lo tanto, no recomendamos usar el aislamiento de lectura repetible en la vista previa si tu esquema tiene restricciones de comprobación.
- Puede que tengas problemas si se producen cambios de esquema simultáneos en tu base de datos mientras se ejecutan transacciones.
- Si tus instrucciones DML usan la opción
last_statementy se produce un cambio de esquema simultáneo mientras se ejecuta la instrucción DML, es posible que se vuelva a intentar internamente y se devuelva un error que indique que la instrucción DML se ha vuelto a intentar de forma incorrecta después de definir la opciónlast_statement. Si se vuelve a intentar la transacción después de que se aplique el cambio de esquema, se solucionará este problema. - Si las solicitudes de una transacción experimentan un error
DEADLINE_EXCEEDEDdel cliente, vuelve a intentar la transacción después de que se aplique el cambio de esquema para resolver el problema.
- Si tus instrucciones DML usan la opción
Casos prácticos no admitidos
- No puedes definir el aislamiento de lectura repetible en transacciones DML particionadas.
- Todas las transacciones de solo lectura ya operan en una captura fija y no requieren bloqueos, por lo que definir el aislamiento de lectura repetible en este tipo de transacción no cambia ningún comportamiento.
- No puedes definir el aislamiento de lectura repetible en operaciones de solo lectura, de un solo uso y de partición con las bibliotecas cliente de Spanner. Las bibliotecas cliente de Spanner no tendrán la opción de definir el aislamiento de lectura repetible en operaciones de consulta de solo lectura, de un solo uso y de partición.
Siguientes pasos
Consulta cómo usar SELECT FOR UPDATE en el aislamiento de lectura repetible.
Para obtener más información sobre la serialización y la coherencia externa de Spanner, consulta TrueTime y coherencia externa.