Las transacciones de Spanner ofrecen dos modos de control de simultaneidad: pesimista y optimista. La elección del modo de control de simultaneidad afecta la forma en que las transacciones controlan las lecturas y escrituras simultáneas, lo que influye en el rendimiento, la latencia y las tasas de anulación de transacciones. Elige el modo que mejor se adapte a los requisitos de rendimiento y coherencia de tu aplicación.
El comportamiento predeterminado depende del nivel de aislamiento que use tu transacción:
- El aislamiento serializable usa el control de simultaneidad pesimista de forma predeterminada.
- El aislamiento de lectura repetible, usa el control de simultaneidad optimista de forma predeterminada.
Control de simultaneidad pesimista
De forma predeterminada, Spanner usa la simultaneidad pesimista con aislamiento serializable. También puedes usar la simultaneidad pesimista con aislamiento de lectura repetible.
Simultaneidad pesimista en aislamiento serializable
Este modo supone que las transacciones simultáneas podrían competir por los mismos datos. Adquiere bloqueos de forma proactiva en los datos a medida que se leen o escriben dentro de una transacción. También verifica que los bloqueos adquiridos anteriormente en la transacción permanezcan en las instrucciones posteriores. Cuando Spanner detecta un conflicto de bloqueo, usa el algoritmo de prevención para resolverlo.
En la simultaneidad pesimista, las transacciones adquieren bloqueos en los datos durante las fases de ejecución y confirmación de la transacción.
- Para las lecturas: Cuando una transacción lee datos, adquiere un
bloqueo de lectura compartida (
ReaderShared) durante la fase de ejecución. Estos bloqueos se mantienen hasta que se confirma la transacción. - Para DML y escrituras:
- Durante la ejecución, para los datos modificados por DML o escrituras, la transacción podría adquirir bloqueos de lectura en la existencia de filas.
- En el momento de la confirmación, la transacción intenta adquirir bloqueos de escritura o exclusivos para los datos escritos. Los bloqueos de escritura bloquean las lecturas simultáneas, pero es posible que no bloqueen las escrituras simultáneas, en especial cuando ambas usan bloqueos de escritura. Esto significa que varias transacciones pueden continuar con la confirmación, y los conflictos de escritura y escritura se resuelven en el momento de la confirmación con el algoritmo de prevención. Todos los bloqueos se mantienen hasta que se confirma la transacción.
Simultaneidad pesimista en aislamiento de lectura repetible
Usa la simultaneidad pesimista en el aislamiento de lectura repetible para serializar las escrituras. En este modo, las operaciones de lectura usan instantáneas, pero
los bloqueos exclusivos
se aplican a los datos leídos de las consultas FOR UPDATE o las
lock_scanned_ranges=exclusive sugerencias, y a los datos escritos con consultas DML.
Beneficios de la simultaneidad pesimista con aislamiento serializable
El principal beneficio de usar la simultaneidad pesimista con aislamiento serializable es que, en cargas de trabajo muy contenciosas, ayuda a que las transacciones progresen. Spanner prioriza las transacciones más antiguas sobre las más recientes durante los conflictos, lo que garantiza que las transacciones se completen y, al mismo tiempo, reduce la cantidad de transacciones que se anulan de forma repetida.
Beneficios de la simultaneidad pesimista con aislamiento de lectura repetible
Con el aislamiento de lectura repetible, las transacciones que adquieren bloqueos aún pueden anularse en el momento de la confirmación si los datos leídos como parte de una consulta con FOR UPDATE o como parte de una consulta DML fueron modificados por una transacción simultánea antes de que se confirme la transacción. Sin embargo, después de adquirir los bloqueos, evita más actualizaciones simultáneas hasta que se confirme la transacción, lo que serializa las escrituras.
Riesgos de la simultaneidad pesimista
La simultaneidad pesimista con aislamiento serializable presenta los siguientes riesgos:
- Las lecturas de larga duración pueden bloquear las escrituras sensibles a la latencia.
- Las transacciones que implican la interacción del usuario antes de la finalización pueden hacer que los bloqueos se mantengan durante un período prolongado, lo que podría bloquear otras operaciones.
Casos de uso de la simultaneidad pesimista con aislamiento serializable
La simultaneidad pesimista es adecuada para cargas de trabajo con alta contención de lectura y escritura, y de escritura y escritura. También es apropiada cuando las anulaciones y los reintentos de transacciones son costosos. Usa este modo predeterminado, a menos que tu carga de trabajo tenga retrasos excesivos de bloqueo prolongado o se vea afectada de manera significativa por los conflictos de bloqueo.
Casos de uso de la simultaneidad pesimista con aislamiento de lectura repetible
Usa la simultaneidad pesimista con lectura repetible para cargas de trabajo que requieran una cláusula FOR UPDATE o consultas DML para adquirir bloqueos. Este enfoque es especialmente útil para las cargas de trabajo migradas a Spanner desde otras bases de datos que adquieren bloqueos para estas instrucciones.
Control de simultaneidad optimista
Spanner también proporciona control de simultaneidad optimista. Cuando usas el aislamiento de lectura repetible, el modo predeterminado es el control de simultaneidad optimista. También puedes configurar el aislamiento serializable para usar el control de simultaneidad optimista.
El control de simultaneidad optimista supone que los conflictos son poco frecuentes. Las lecturas y las consultas, incluso dentro de una transacción de lectura y escritura, continúan sin adquirir bloqueos.
Con el aislamiento serializable predeterminado de Spanner, las lecturas se validan en el momento de la confirmación. Esto garantiza que ninguna otra transacción confirmada de forma simultánea haya modificado los datos leídos anteriormente por la transacción. Si usas
el aislamiento de lectura repetible,
las lecturas con una sugerencia FOR UPDATE o lock_scanned_ranges=exclusive se
validan en el momento de la confirmación. Si Spanner detecta un conflicto, anula la transacción.
Cómo funciona la simultaneidad optimista
La simultaneidad optimista cambia la forma en que Spanner ejecuta lecturas, consultas y confirma transacciones. Realiza una ejecución sin bloqueo durante la fase de lectura y valida la coherencia en la confirmación.
Para lecturas y consultas
Las lecturas y las consultas no tienen bloqueo. Todas las lecturas y consultas dentro de una transacción optimista se ejecutan en una sola marca de tiempo de instantánea. Spanner elige esta marca de tiempo cuando se ejecuta la primera lectura o consulta. Esto garantiza que todas las lecturas y consultas posteriores dentro de la transacción vean las escrituras confirmadas antes de la primera lectura o consulta.
Para lecturas y escrituras
Para una transacción optimista con lecturas y escrituras, Spanner realiza un paso de validación en el momento de la confirmación. La transacción se confirma correctamente solo si no se detectan conflictos y se cumplen las siguientes condiciones:
- Ninguna escritura confirmada de forma simultánea entra en conflicto con los datos leídos por esta transacción; es decir, no se confirmó ninguna escritura después de la marca de tiempo de lectura, pero antes de que esta transacción confirme sus propias escrituras.
- El esquema no se modificó desde la marca de tiempo de lectura.
El nivel de aislamiento determina el conjunto de lecturas que se validan. Con el aislamiento serializable, se validan todas las lecturas. Con el aislamiento de lectura repetible, las lecturas con una sugerencia FOR UPDATE o lock_scanned_ranges=exclusive se validan en el momento de la confirmación.
En condiciones de alta contención, las transacciones optimistas pueden anularse de forma repetida. Por el contrario, las transacciones pesimistas resuelven los conflictos de lectura y escritura permitiendo que se confirme la transacción más antigua y reintentando la transacción más reciente.
Beneficios de la simultaneidad optimista
La simultaneidad optimista ofrece los siguientes beneficios:
- Las lecturas no adquieren bloqueos: Las transacciones optimistas no adquieren bloqueos para las lecturas, por lo que las lecturas de larga duración no bloquean las escrituras sensibles a la latencia.
- Latencia de confirmación reducida para transacciones de solo lectura: Debido a que todas las lecturas dentro de una transacción optimista se basan en la misma marca de tiempo de instantánea, no es necesario verificar la coherencia durante la ejecución o la confirmación de estas lecturas, lo que reduce significativamente la latencia.
Riesgos de la simultaneidad optimista
La simultaneidad optimista introduce riesgos, en especial en condiciones de alta contención de lectura y escritura cuando se usa con aislamiento serializable. Comprende estos riesgos antes de usar el control de simultaneidad optimista con aislamiento serializable para tu carga de trabajo.
- En condiciones de alta contención de lectura y escritura, las transacciones optimistas pueden experimentar una alta tasa de anulaciones, ya que las escrituras simultáneas pueden invalidar las lecturas de una transacción optimista.
- Con una contención alta persistente, una transacción puede anularse de forma repetida y nunca confirmarse por falta de transacción.
Casos de uso de la simultaneidad optimista
La simultaneidad optimista es adecuada para cargas de trabajo transaccionales con baja contención de lectura y escritura. Para las transacciones serializables, también beneficia a las cargas de trabajo que pueden tolerar las anulaciones de transacciones.
Considera la simultaneidad optimista para las siguientes cargas de trabajo:
- Cargas de trabajo de baja prioridad y tolerantes a la latencia con transacciones de larga duración: Usa la simultaneidad optimista si las lecturas o consultas de larga duración pueden retrasar las escrituras sensibles a la latencia. Esto evita los retrasos causados por los bloqueos de lectura. Por ejemplo, las transacciones en clientes móviles con conexiones lentas o las transacciones de bajo ANS que mantienen bloqueos de lectura para muchas filas o rangos grandes.
- Cargas de trabajo transaccionales sensibles a la latencia de lectura con baja contención de lectura y escritura: En una configuración multirregional, usa la simultaneidad optimista para entregar lecturas de forma regional, reducir las latencias de lectura y evitar problemas de producción debido al tráfico de lectura con picos a una división activa. También mejora la disponibilidad de lectura durante la sobrecarga o la falta de disponibilidad del líder.
- Cargas de trabajo transaccionales en las que la mayoría de las transacciones son de solo lectura: Cambiar a la simultaneidad optimista reduce la latencia de confirmación para las transacciones comunes de solo lectura en estas cargas de trabajo. Asegúrate de que haya una baja contención de lectura y escritura para evitar tasas de anulación altas para las transacciones de lectura y escritura.
Evita usar la simultaneidad optimista para cargas de trabajo transaccionales sensibles a la latencia en las que los conflictos de lectura y escritura son frecuentes.
Configura el control de simultaneidad
Puedes usar las bibliotecas cliente, la API de REST y la API de RPC de Spanner para especificar el modo de simultaneidad para las transacciones de lectura y escritura.
Bibliotecas cliente
Java
Go
Node.js
Python
C#
C++
REST
La API de REST de TransactionOptions
de Spanner proporciona una enumeración ReadLockMode dentro del mensaje ReadWrite que
te permite seleccionar el modo de bloqueo PESSIMISTIC o OPTIMISTIC.
RPC
La API de RPC de Transactionoptions de Spanner proporciona una enumeración ReadLockMode dentro del mensaje ReadWrite que te permite seleccionar el modo de bloqueo PESSIMISTIC o OPTIMISTIC.
Controladores
Puedes usar los controladores de Spanner para establecer read_lock_mode como un parámetro de conexión en el nivel de conexión o como una opción de instrucción SET en el nivel de transacción. Para obtener más información sobre cada controlador, consulta
Descripción general de los controladores.
¿Qué sigue?
- Obtén más información sobre los niveles de aislamiento de Spanner.
- Aprende a usar el aislamiento de lectura repetible.