Introducción
Cuando lees datos en Spanner en una transacción de solo lectura o en una única llamada de lectura, puedes definir un límite de marca de tiempo, que indica a Spanner cómo elegir una marca de tiempo en la que leer los datos.
¿Por qué definir un límite de marca de tiempo? Si tu base de datos está distribuida geográficamente (es decir, has creado tu instancia de Spanner con una configuración de instancia multirregional) y tu aplicación puede tolerar cierta obsolescencia al leer datos, puedes obtener ventajas de latencia ejecutando una lectura obsoleta en lugar de una lectura coherente. (Consulta más información sobre estos tipos de lecturas en Lecturas).
Tipos de límites de marcas de tiempo
Los tipos de límites de marca de tiempo son los siguientes:
- Sólida (opción predeterminada): lee los datos más recientes.
- Obsoleto limitado: lee una versión de los datos que no esté obsoleta más allá de un límite.
- Antigüedad exacta: lee la versión de los datos en una marca de tiempo exacta, por ejemplo, un momento del pasado, aunque puedes especificar una marca de tiempo de un momento que aún no haya pasado. Si especificas una marca de tiempo futura, Spanner esperará hasta esa marca de tiempo antes de servir la lectura.
Notas:
Aunque las lecturas que usan estos modos de límite de marca de tiempo no forman parte de una transacción de lectura y escritura, pueden bloquear la espera de que se completen las transacciones de lectura y escritura simultáneas. Las lecturas de obsolescencia limitada intentan elegir una marca de tiempo para evitar el bloqueo, pero es posible que se bloqueen igualmente.
Las lecturas obsoletas (es decir, las que usan los tipos de obsolescencia acotada o exacta) ofrecen el máximo rendimiento con los intervalos de obsolescencia más largos. Usa un tiempo mínimo de antigüedad de 10 segundos para obtener un beneficio.
Spanner registra la
earliest_version_time
de una base de datos, que especifica la hora más antigua en la que se pueden leer las versiones anteriores de los datos. No puedes leer en una marca de tiempo anterior a la hora de la versión más antigua.
Los tipos de límites de marca de tiempo de Spanner se explican con más detalle a continuación.
Óptima
Spanner proporciona un tipo de límite para las lecturas sólidas. Las lecturas sólidas tienen la garantía de ver los efectos de todas las transacciones que se hayan confirmado antes del inicio de la lectura. Además, todas las filas que genera una sola lectura son coherentes entre sí. Si alguna parte de la lectura observa una transacción, todas las partes de la lectura verán la transacción.
Las lecturas sólidas no se pueden repetir: dos transacciones consecutivas de solo lectura sólidas pueden devolver resultados incoherentes si hay escrituras simultáneas. Si se requiere coherencia entre las lecturas, estas deben ejecutarse en la misma transacción o en una marca de tiempo de lectura exacta.
Falta de actualización delimitada
Spanner proporciona un tipo de límite para la obsolescencia limitada. Los modos de obsolescencia limitada permiten a Spanner elegir la marca de tiempo de lectura, sujeta a un límite de obsolescencia proporcionado por el usuario. Spanner elige la marca de tiempo más reciente dentro del límite de obsolescencia que permite ejecutar las lecturas en la réplica disponible más cercana sin bloquearse.
Todas las filas devueltas son coherentes entre sí. Si alguna parte de la lectura observa una transacción, todas las partes de la lectura ven la transacción. Las lecturas obsoletas con límite no se pueden repetir: dos lecturas obsoletas, aunque usen el mismo límite de obsolescencia, se pueden ejecutar en marcas de tiempo diferentes y, por lo tanto, devolver resultados incoherentes.
Las lecturas con obsolescencia limitada suelen ser un poco más lentas que las lecturas con obsolescencia exacta comparables.
Obsoleto exacto
Spanner proporciona un tipo de límite para la latencia exacta. Estos límites de marca de tiempo ejecutan lecturas en una marca de tiempo especificada por el usuario. Se garantiza que las lecturas en una marca de tiempo verán un prefijo coherente del historial de transacciones global: observan las modificaciones realizadas por todas las transacciones con una marca de tiempo de confirmación inferior o igual a la marca de tiempo de lectura, y no observan ninguna de las modificaciones realizadas por las transacciones con una marca de tiempo de confirmación superior. Se bloquearán hasta que finalicen todas las transacciones conflictivas a las que se les pueda asignar marcas de tiempo de confirmación inferiores o iguales a la marca de tiempo de lectura.
La marca de tiempo se puede expresar como una marca de tiempo de confirmación de Spanner absoluta o como un tiempo de obsolescencia relativo a la hora actual.
Estos modos no requieren una "fase de negociación" para elegir una marca de tiempo. Por lo tanto, se ejecutan un poco más rápido que los modos de simultaneidad con obsolescencia limitada equivalentes. Por otro lado, las lecturas obsoletas acotadas suelen devolver resultados más recientes.
Antigüedad máxima de la marca de tiempo
Spanner recoge continuamente los datos eliminados y sobrescritos en segundo plano para recuperar espacio de almacenamiento. Este proceso se conoce como recolección de elementos no utilizados de versiones. La versión GC reclama las versiones después de que caduquen tras el version_retention_period
de una base de datos, que es de 1 hora de forma predeterminada, pero se puede configurar hasta 1 semana.
Esta restricción también se aplica a las lecturas o consultas SQL en curso cuya marca de tiempo sea demasiado antigua mientras se ejecutan. Las lecturas y las consultas de SQL con marcas de tiempo de lectura demasiado antiguas fallan y devuelven el error FAILED_PRECONDITION
. La única excepción es Lectura o consulta de partición con tokens de partición, que evitará la recolección de elementos no utilizados de los datos caducados mientras la sesión siga activa.