stringtranslate.com

Aislamiento de instantáneas

En bases de datos y procesamiento de transacciones (administración de transacciones), el aislamiento de instantáneas es una garantía de que todas las lecturas realizadas en una transacción verán una instantánea consistente de la base de datos (en la práctica, lee los últimos valores confirmados que existían en el momento de su inicio), y la transacción en sí se confirmará exitosamente solo si ninguna actualización que haya realizado entre en conflicto con las actualizaciones simultáneas realizadas desde esa instantánea.

El aislamiento de instantáneas ha sido adoptado por varios sistemas importantes de gestión de bases de datos , como InterBase , Firebird , Oracle , MySQL , [1] PostgreSQL , SQL Anywhere , MongoDB [2] y Microsoft SQL Server (2005 y posteriores). La razón principal para su adopción es que permite un mejor rendimiento que la serialización , pero aún así evita la mayoría de las anomalías de concurrencia que evita la serialización (pero no todas). En la práctica, el aislamiento de instantáneas se implementa dentro del control de concurrencia multiversión (MVCC), donde se mantienen los valores generacionales de cada elemento de datos (versiones): MVCC es una forma común de aumentar la concurrencia y el rendimiento generando una nueva versión de un objeto de base de datos cada vez que el objeto está escrito y permite operaciones de lectura de transacciones de varias de las últimas versiones relevantes (de cada objeto). El aislamiento de instantáneas se ha utilizado [3] para criticar la definición de niveles de aislamiento del estándar ANSI SQL -92 , ya que no muestra ninguna de las "anomalías" que el estándar SQL prohibía, pero no es serializable (el nivel de aislamiento libre de anomalías definido por ANSI ).

A pesar de su distinción de la serialización, Oracle a veces se refiere al aislamiento de instantáneas como serializable .

Definición

Una transacción que se ejecuta bajo aislamiento de instantánea parece operar en una instantánea personal de la base de datos, tomada al inicio de la transacción. Cuando la transacción concluya, se confirmará con éxito solo si los valores actualizados por la transacción no se han modificado externamente desde que se tomó la instantánea. Tal conflicto de escritura-escritura hará que la transacción se cancele.

En una anomalía de sesgo de escritura , dos transacciones (T1 y T2) leen simultáneamente un conjunto de datos superpuestos (por ejemplo, los valores V1 y V2), realizan simultáneamente actualizaciones separadas (por ejemplo, T1 actualiza V1, T2 actualiza V2) y, finalmente, se confirman simultáneamente, sin haber visto la actualización realizada por el otro. Si el sistema fuera serializable, tal anomalía sería imposible, ya que T1 o T2 tendrían que ocurrir "primero" y ser visibles para el otro. Por el contrario, el aislamiento de instantáneas permite anomalías de sesgo de escritura.

Como ejemplo concreto, imaginemos que V1 y V2 son dos balanzas sostenidas por una sola persona, Phil. El banco permitirá que V1 o V2 ​​tengan déficit, siempre que el total mantenido en ambos nunca sea negativo (es decir, V1 + V2 ≥ 0). Ambos saldos son actualmente de $100. Phil inicia dos transacciones al mismo tiempo: T1 retira $200 de V1 y T2 retira $200 de V2.

Si la base de datos garantiza transacciones serializables, la forma más sencilla de codificar T1 es deducir $200 de V1 y luego verificar que V1 + V2 ≥ 0 todavía se cumple, abortando si no. De manera similar, T2 deduce $200 de V2 y luego verifica que V1 + V2 ≥ 0. Dado que las transacciones deben serializarse, T1 ocurre primero, dejando V1 = −$100, V2 = $100 e impidiendo que T2 tenga éxito (ya que V1 + (V2 − $200) ahora es −$200), o T2 ocurre primero y de manera similar evita que T1 se comprometa.

Sin embargo, si la base de datos está bajo aislamiento de instantáneas (MVCC), T1 y T2 operan en instantáneas privadas de la base de datos: cada uno deduce $200 de una cuenta y luego verifica que el nuevo total sea cero, utilizando el otro valor de cuenta que tenía cuando se se tomó la instantánea. Dado que ninguna de las actualizaciones entra en conflicto, ambas se confirman correctamente, dejando V1 = V2 = −$100 y V1 + V2 = −$200.

Algunos sistemas creados con control de concurrencia multiversión (MVCC) pueden admitir (solo) el aislamiento de instantáneas para permitir que las transacciones continúen sin preocuparse por las operaciones concurrentes y, lo que es más importante, sin necesidad de volver a verificar todas las operaciones de lectura cuando la transacción finalmente se confirma. Esto es conveniente porque MVCC mantiene una serie de estados consistentes con la historia reciente. La única información que debe almacenarse durante la transacción es una lista de actualizaciones realizadas, que se pueden escanear en busca de conflictos con bastante facilidad antes de confirmarlas. Sin embargo, los sistemas MVCC (como MarkLogic) utilizarán bloqueos para serializar escrituras junto con MVCC para obtener algunas de las ganancias de rendimiento y aún admitir el nivel de aislamiento de "serialización" más fuerte.

Soluciones alternativas

Los posibles problemas de inconsistencia que surgen de anomalías de sesgo de escritura se pueden solucionar agregando actualizaciones (que de otro modo serían innecesarias) a las transacciones para hacer cumplir la propiedad de serialización . [4] [5] [6] [7]

Materializar el conflicto
Agregue una tabla de conflictos especial, que ambas transacciones actualizan para crear un conflicto directo de escritura-escritura.
Promoción
Haga que una transacción "actualice" una ubicación de solo lectura (reemplazando un valor con el mismo valor) para crear un conflicto directo de escritura-escritura (o use una promoción equivalente, por ejemplo SELECT FOR UPDATE de Oracle).

En el ejemplo anterior, podemos materializar el conflicto agregando una nueva tabla que haga explícita la restricción oculta, asignando a cada persona su saldo total . Phil comenzaría con un saldo total de $200, y cada transacción intentaría restar $200 de esto, creando un conflicto de escritura que impediría que las dos tuvieran éxito al mismo tiempo. Sin embargo, este enfoque viola la forma normal .

Alternativamente, podemos promover una de las lecturas de la transacción a escritura. Por ejemplo, T2 podría establecer V1 = V1, creando un conflicto artificial de escritura-escritura con T1 y, nuevamente, impidiendo que los dos tengan éxito al mismo tiempo. Es posible que esta solución no siempre sea posible.

Por lo tanto, en general, el aislamiento de instantáneas plantea parte del problema de mantener restricciones no triviales al usuario, quien puede no apreciar ni los posibles problemas ni las posibles soluciones. La ventaja de esta transferencia es un mejor rendimiento.

Terminología

El aislamiento de instantáneas se denomina modo "serializable" en las versiones de Oracle [8] [9] [10] y PostgreSQL anteriores a 9.1, [11] [12] [13], lo que puede causar confusión con el modo de " serialización real ". Hay argumentos tanto a favor como en contra de esta decisión; lo que está claro es que los usuarios deben ser conscientes de la distinción para evitar posibles comportamientos anómalos no deseados en la lógica de su sistema de base de datos.

Historia

El aislamiento de instantáneas surgió del trabajo en bases de datos de control de concurrencia de múltiples versiones , donde se mantienen múltiples versiones de la base de datos simultáneamente para permitir que los lectores ejecuten sin chocar con los escritores. Un sistema de este tipo permite una definición y una implementación naturales de dicho nivel de aislamiento. [3] Se reconoció que InterBase , posteriormente propiedad de Borland , proporcionaba SI en lugar de serialización completa en la versión 4, [3] y probablemente permitió anomalías de sesgo de escritura desde su primer lanzamiento en 1985. [14]

Desafortunadamente, el estándar ANSI SQL-92 se escribió teniendo en mente una base de datos basada en bloqueos y, por lo tanto, es bastante vago cuando se aplica a sistemas MVCC. Berenson et al. escribió un artículo en 1995 [3] criticando el estándar SQL y citó el aislamiento de instantáneas como un ejemplo de un nivel de aislamiento que no exhibía las anomalías estándar descritas en el estándar ANSI SQL-92, pero aún tenía un comportamiento anómalo en comparación con las transacciones serializables . .

En 2008, Cahill et al. demostró que las anomalías de sesgo de escritura se podían prevenir detectando y abortando tripletes "peligrosos" de transacciones concurrentes. [15] Esta implementación de serialización se adapta bien a bases de datos de control de concurrencia multiversión y se adoptó en PostgreSQL 9.1, [12] [13] [16], donde se conoce como aislamiento de instantáneas serializables (SSI). Cuando se usa de manera consistente, esto elimina la necesidad de las soluciones alternativas anteriores. La desventaja del aislamiento de instantáneas es un aumento en las transacciones abortadas. Esto puede funcionar mejor o peor que el aislamiento de instantáneas con las soluciones alternativas anteriores, según la carga de trabajo.

Referencias

  1. ^ "MySQL :: Manual de referencia de MySQL 8.0 :: 15.5.2.3 Lecturas consistentes sin bloqueo". dev.mysql.com . Consultado el 27 de agosto de 2018 .
  2. ^ Control de concurrencia multiversión en MongoDB, CTO de MongoDB: cómo nuestro nuevo motor de almacenamiento WiredTiger ganará su prestigio
  3. ^ abcd Berenson, Hal; Bernstein, Phil; Gris, Jim; Melton, Jim; O'Neil, Elizabeth ; O'Neil, Patrick (1995), "Una crítica de los niveles de aislamiento de ANSI SQL", Actas de la conferencia internacional ACM SIGMOD de 1995 sobre gestión de datos , págs. 1 a 10, arXiv : cs/0701157 , doi : 10.1145/223784.223785, ISBN 978-0897917315, S2CID  2316540
  4. ^ Fekete, Alan; Liarokapis, Dimitrios; O'Neil, Elizabeth ; O'Neil, Patricio ; Shasha, Dennis (2005), "Hacer serializable el aislamiento de instantáneas", Transacciones ACM en sistemas de bases de datos , 30 (2): 492–528, CiteSeerX 10.1.1.503.3169 , doi :10.1145/1071610.1071615, ISSN  0362-5915, S2CID  1815415 
  5. ^ Michael J. Cahill, Uwe Röhm, Alan D. Fekete (2008): "Aislamiento serializable para bases de datos de instantáneas", Actas de la conferencia internacional ACM SIGMOD de 2008 sobre gestión de datos , págs. 729-738, Vancouver, Canadá, junio de 2008 , ISBN 978-1-60558-102-6 (Premio SIGMOD 2008 al mejor artículo) 
  6. ^ Michael J. Cahill, Uwe Röhm, Alan D. Fekete (2008): "Aislamiento serializable para bases de datos de instantáneas", Actas de la conferencia internacional ACM SIGMOD de 2008 sobre gestión de datos , págs. 729-738, Vancouver, Canadá, junio de 2008 , ISBN 978-1-60558-102-6 (Premio SIGMOD 2008 al mejor artículo) 
  7. ^ Alan Fekete (2009), "Aislamiento de instantáneas y ejecución serializable", Presentación, página 4, 2009, Universidad de Sydney (Australia). Consultado el 16 de septiembre de 2009.
  8. ^ Oracle Database Concepts 10g Versión 1 (10.1) Capítulo 13: Simultaneidad y coherencia de datos: niveles de aislamiento de Oracle
  9. ^ Pregúntele a Tom: sobre los niveles de aislamiento de transacciones
  10. ^ Pregúntele a Tom: "Transacción serializable"
  11. ^ Documentación de PostgreSQL 9.0: 13.2.2.1. Aislamiento serializable versus serializabilidad verdadera
  12. ^ ab Comunicado de prensa de PostgreSQL 9.1
  13. ^ ab Documentación de PostgreSQL 9.1.14: 13.2.3. Nivel de aislamiento serializable
  14. ^ Stuntz, Craig. "Control de concurrencia multiversión antes de InterBase". Archivado desde el original el 23 de octubre de 2007 . Consultado el 30 de octubre de 2014 .
  15. ^ Michael J. Cahill, Uwe Röhm, Alan D. Fekete (2008) "Aislamiento serializable para bases de datos de instantáneas", Actas de la conferencia internacional ACM SIGMOD de 2008 sobre gestión de datos , págs. 729–738, ISBN 978-1-60558- 102-6 (premio SIGMOD 2008 al mejor artículo) 
  16. ^ Puertos, Dan RK; Grittner, Kevin (2012). "Aislamiento de instantáneas serializables en PostgreSQL" (PDF) . Actas del Fondo de Dotación VLDB . 5 (12): 1850–1861. arXiv : 1208.4179 . CiteSeerX 10.1.1.294.3803 . doi :10.14778/2367502.2367523. S2CID  16006111. 

Otras lecturas