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 simultaneidad pesimista con aislamiento serializable. En este modo, se 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 se mantengan 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 la fila.
- 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 ambos usan bloqueos de escritura. Esto significa que varias transacciones pueden proceder a la confirmación, y los conflictos de escritura-escritura se resuelven en el momento de la confirmación con el algoritmo de herida y espera. Todos los bloqueos se mantienen hasta que se confirma la transacción.
Beneficios de la simultaneidad pesimista con aislamiento serializable
El principal beneficio de usar la simultaneidad pesimista con el aislamiento serializable es que, en cargas de trabajo muy contenciosas, ayuda a que las transacciones avancen. Spanner prioriza las transacciones más antiguas sobre las más recientes durante los conflictos, lo que garantiza que las transacciones se completen y reduce la cantidad de transacciones que se anulan repetidamente.
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 completarse pueden hacer que los bloqueos se mantengan durante mucho tiempo, lo que podría bloquear otras operaciones.
Casos de uso de la simultaneidad pesimista
La simultaneidad pesimista es adecuada para cargas de trabajo con alta contención de lectura-escritura y escritura-escritura. También es adecuado cuando los reintentos y las anulaciones de transacciones son costosos. Usa este modo predeterminado, a menos que tu carga de trabajo tenga demoras excesivas de bloqueo prolongado o se vea afectada de manera significativa por conflictos de bloqueo.
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, se realizan 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 que leyó la transacción. Si usas el aislamiento de lectura repetible, las lecturas con una sugerencia de 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 la 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 bloqueos. 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
En el caso de 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:
- No hay escrituras confirmadas de forma simultánea que entren en conflicto con los datos leídos por esta transacción, es decir, no se confirmaron escrituras 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 de FOR UPDATE o lock_scanned_ranges=exclusive se validan en el momento de la confirmación.
En situaciones de alta contención, es posible que las transacciones optimistas se anulen de forma reiterada. En cambio, 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 las transacciones de solo lectura: Dado 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 particular, 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, es posible que una transacción se anule repetidamente y nunca se confirme debido a la inanición de la 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. En el caso de las transacciones serializables, también beneficia a las cargas de trabajo que pueden tolerar la anulación 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 las demoras causadas por los bloqueos de lectura. Por ejemplo, transacciones en clientes móviles con conexiones lentas o transacciones con un ANS bajo 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 en 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 poca contención de lectura y escritura para evitar tasas altas de cancelación de transacciones de lectura y escritura.
Evita usar la simultaneidad optimista para las 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 de las transacciones de lectura y escritura.
Bibliotecas cliente
Java
Go
Node.js
Python
C#
REST
La API de REST de TransactionOptions de Spanner proporciona un enum 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 un enum 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 a nivel de la conexión o como una opción de la instrucción read_lock_mode a nivel de la transacción.SET Para obtener más información sobre cada controlador, consulta la Descripción general de los controladores.
¿Qué sigue?
- Obtén más información sobre los niveles de aislamiento de Spanner.
- Obtén más información para usar el aislamiento de lectura repetible.