Límites de marcas de tiempo

Introducción

Cuando lees datos en Spanner en una transacción de solo lectura o en una llamada de una sola lectura, puedes establecer un límite de marca de tiempo, que le indica a Spanner cómo elegir una marca de tiempo en la que leer los datos.

¿Por qué establecer un límite de marca de tiempo? Si tu base de datos está distribuida geográficamente (es decir, si creaste la instancia de Spanner con una configuración de instancias multirregional) y tu aplicación puede tolerar cierta inactividad cuando lee datos, puedes obtener beneficios de latencia de la ejecución de una lectura inactiva en lugar de una lectura sólida. (Consulta Lecturas para obtén más información sobre estos tipos de lectura).

Tipos de límites de marca de tiempo

Los tipos de límites de marca de tiempo son los siguientes:

  • Óptima (predeterminado): lee los datos más recientes.
  • Inactividad limitada: lee una versión de los datos que no es más inactiva que un límite.
  • Inactividad exacta: lee la versión de los datos en una marca de tiempo exacta, p. ej., un punto en el pasado, aunque puedes especificar una marca de tiempo para un momento que aún no ha sucedido. (Si especificas una marca de tiempo en el futuro, Spanner esperará esa marca de tiempo antes de entregar la lectura).

Notas:

  • Aunque las lecturas que usan estos límites de marca de tiempo no son parte de una transacción de lectura y escritura, pueden bloquear la espera de transacciones de lectura y escritura simultáneas a confirmarse. Las lecturas de inactividad limitada intentan elegir una marca de tiempo para evitar el bloqueo, pero puede que aún se bloqueen.

  • Las lecturas inactivas (es decir, el uso de los tipos de inactividad limitada o exacta) tienen el beneficio máximo de rendimiento en los intervalos de inactividad más prolongados. Usa un mínimo de 10 segundos de inactividad para obtener un beneficio.

  • Spanner realiza un seguimiento del earliest_version_time de una base de datos, que especifica el momento más temprano en el que se pueden leer versiones anteriores de los datos. No puedes leer en una marca de tiempo anterior a la primera versión.

Los tipos de límites de marca de tiempo de Spanner se explican con más detalle a continuación.

Sólida

Spanner proporciona un tipo de límite para lecturas sólidas. Se garantiza que las lecturas sólidas verán los efectos de todas las transacciones confirmadas antes del inicio de la lectura. Además, todas las filas generadas por una sola lectura 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 sólidas no se pueden repetir: dos transacciones consecutivas de solo lectura sólida podrían mostrar resultados incoherentes si hay escrituras simultáneas. Si se requiere coherencia entre las lecturas, las lecturas deben ejecutarse dentro de la misma transacción o en una marca de tiempo de lectura exacta.

Inactividad limitada

Spanner proporciona un tipo de límite para la inactividad limitada. Los modos de inactividad limitada permiten que Spanner elija la marca de tiempo de lectura, sujeta a un límite de inactividad proporcionado por el usuario. Spanner elige la marca de tiempo más reciente dentro del límite de inactividad que permite la ejecución de las lecturas en la réplica más cercana disponible sin bloquear.

Todas las filas generadas 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 con inactividad limitada no se pueden repetir: dos lecturas inactivas, aunque usen el mismo límite de inactividad, pueden ejecutarse en diferentes marcas de tiempo y, de esa forma, mostrar resultados inconsistentes.

Las lecturas de inactividad limitada suelen ser un poco más lentas que las lecturas de inactividad exacta.

Inactividad exacta

Spanner proporciona un tipo de límite para la inactividad 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 ven un prefijo coherente del historial global de transacciones: observan las modificaciones hechas 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 modificación hecha por transacciones con una marca de tiempo de confirmación mayor. Se bloquearán hasta que hayan terminado todas las transacciones conflictivas a las que se les hayan asignado 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 absoluta de Spanner o una inactividad relativa a la hora actual.

Estos modos no requieren una “fase de negociación” para elegir una marca de tiempo. Como resultado, se ejecutan un poco más rápido que los modos de simultaneidad de inactividad limitada equivalentes. Por otro lado, las lecturas de inactividad limitada suelen mostrar resultados más recientes.

Máxima marca de tiempo de inactividad

Spanner recolecta continuamente los datos borrados y reemplazados en segundo plano para recuperar espacio de almacenamiento. A este proceso se lo conoce como versión GC. La versión GC recupera versiones una vez que vencen después de la version_retention_period de una base de datos, cuyo valor predeterminado es de 1 hora, pero se puede configurar hasta 1 semana. Esta restricción también se aplica a las lecturas o consultas de SQL en curso cuya marca de tiempo haya pasado a ser demasiado antigua durante la ejecución. Las lecturas y las consultas de SQL con marcas de tiempo de lectura demasiado antiguas fallan con el error FAILED_PRECONDITION. La única excepción es la consulta de lectura/consulta con tokens de partición, que evitará la recolección de elementos no utilizados de datos vencidos mientras la sesión permanezca activa.