驴Qu茅 puede resultar de debilitar el nivel de aislamiento de transacciones en bases de datos?

Hola a todos. En contacto Vladislav Rodin. Actualmente, soy el jefe del curso High Load Architect en OTUS, y tambi茅n doy cursos sobre arquitectura de software.

Adem谩s de la ense帽anza, como habr谩s notado, tambi茅n estoy escribiendo material de copyright para el blog OTUS en el centro y quiero coincidir con el art铆culo de hoy para lanzar el curso "PostgreSQL" , que actualmente est谩 abierto para reclutamiento.




Introducci贸n


La 煤ltima vez que usted y yo hablamos sobre esa transacci贸n en bases de datos utilizadas para dos prop贸sitos: garantizar la tolerancia a fallas y el acceso a datos en un entorno competitivo. Para completar estas tareas, una transacci贸n debe tener propiedades ACID. Hoy hablaremos en detalle sobre la letra I (aislamiento) en esta abreviatura.


Aislamiento


El aislamiento resuelve el problema de acceder a los datos en un entorno competitivo, proporcionando protecci贸n efectiva contra las condiciones de carrera. Idealmente, aislamiento significa serializaci贸n, es decir, una propiedad que garantiza que el resultado de la ejecuci贸n de transacciones en paralelo sea el mismo que si se ejecutaran secuencialmente. El principal problema de esta propiedad es que es t茅cnicamente muy dif铆cil de proporcionar y, como resultado, tiene un impacto significativo en el rendimiento del sistema. Es por eso que el aislamiento a menudo se debilita, aceptando los riesgos de algunas anomal铆as, que se discutir谩n a continuaci贸n. La posibilidad de que ocurran ciertas anomal铆as de la misma manera caracteriza el nivel de aislamiento de la transacci贸n.

Las anomal铆as m谩s famosas son: lectura sucia, lectura no repetible, lectura fantasma, pero de hecho hay 5 m谩s: escritura sucia, actualizaci贸n perdida del cursor, actualizaci贸n perdida, sesgo de lectura, sesgo de escritura.

Escritura sucia


La esencia de la anomal铆a es que las transacciones pueden sobrescribir datos no comprometidos.

imagen

Esta anomal铆a es peligrosa no solo porque los datos pueden entrar en conflicto despu茅s de cometer ambas transacciones (como en la imagen), sino tambi茅n porque se viola la atomicidad: debido a que permitimos sobrescribir datos no bloqueados, no est谩 claro c贸mo deshacer una transacci贸n sin presionar la otra .

La anomal铆a se trata de manera bastante simple: colgamos el bloqueo de escritura antes de que comience la grabaci贸n, prohibiendo que otras transacciones cambien el registro hasta que se libere el bloqueo.

Lectura sucia


Lectura sucia significa leer datos no confirmados.

imagen

Los problemas surgen cuando, en base a una muestra, es necesario llevar a cabo algunas acciones o tomar decisiones.

Para solucionar la anomal铆a, puede colgar un bloqueo de lectura, pero afectar谩 mucho el rendimiento. Es mucho m谩s simple decir que para una transacci贸n de reversi贸n, el estado inicial de los datos (antes de la grabaci贸n) debe almacenarse en el sistema. 驴Por qu茅 no leer desde all铆? Esto es bastante econ贸mico, por lo que la mayor铆a de las bases de datos eliminan la lectura sucia de forma predeterminada.

Actualizaci贸n perdida


La actualizaci贸n perdida significa actualizaciones perdidas, y la traducci贸n refleja con precisi贸n la esencia del problema: de

imagen

hecho, el resultado de la transacci贸n T2 se cancel贸. Esta situaci贸n se soluciona mediante bloqueos de escritura expl铆citos o impl铆citos. Es decir, simplemente actualizamos el registro y luego se produce un bloqueo impl铆cito o realizamos la selecci贸n para la actualizaci贸n , lo que provoca un bloqueo de lectura y escritura. Tenga en cuenta que tal operaci贸n es bastante peligrosa: con nuestra lectura "inocente", bloqueamos otras lecturas. Algunas bases de datos ofrecen una selecci贸n para compartir m谩s segura que le permite leer datos, pero no les permite cambiar.

El cursor perdi贸 la actualizaci贸n


Para un control m谩s preciso, las bases pueden ofrecer otras herramientas, por ejemplo, un cursor. Un cursor es una estructura que contiene un conjunto de l铆neas y le permite iterar sobre ellas. declarar cursor_name para select_statement . El contenido del cursor se describe mediante select.

驴Por qu茅 necesitamos un cursor? El hecho es que algunas bases de datos ofrecen bloqueo en todos los registros seleccionados por select (estabilidad de lectura), o solo en el registro en el que se encuentra actualmente el cursor (estabilidad del cursor). Con la estabilidad del cursor, se implementa un bloqueo corto, que nos permite reducir el n煤mero de bloqueos si iteramos sobre una muestra de datos grande. Por lo tanto, la anomal铆a de actualizaci贸n perdida se resalta por separado para el cursor.

Lectura no repetible


La lectura no repetible es que durante la ejecuci贸n de nuestra transacci贸n 2 lecturas consecutivas del mismo registro conducir谩n a resultados diferentes, porque otra transacci贸n intervino entre estas dos lecturas, cambi贸 nuestros datos y se confirm贸.

imagen

驴Por qu茅 es esto un problema en absoluto? Imagine que el prop贸sito de la transacci贸n T2 en la imagen es seleccionar todos los productos cuyo precio sea inferior a 150 pies c煤bicos Alguien m谩s actualiz贸 el precio a $ 200 Por lo tanto, el filtro instalado no funcion贸.

Estas anomal铆as dejan de ocurrir cuando se agregan bloqueos de dos fases o cuando se usa el mecanismo MVCC, del cual me gustar铆a hablar por separado.

Lectura fantasma


Phantom est谩 leyendo datos que ha sido agregado por otra transacci贸n.

imagen

Como ejemplo, puede observar la selecci贸n incorrecta del producto m谩s barato cuando se produce esta anomal铆a.

Deshacerse de las lecturas fantasmas ya es bastante dif铆cil. El bloqueo normal no es suficiente, porque no podr铆amos bloquear lo que a煤n no est谩 disponible. Los sistemas 2PL usan bloqueo predictivo, mientras que los sistemas MVCC usan un planificador de transacciones para cancelar transacciones que podr铆an ser interrumpidas por una inserci贸n. Tanto el primer como el segundo mecanismo son bastante pesados.

Leer sesgo


El sesgo de lectura surge cuando trabajamos con varias tablas, cuyo contenido deber铆a cambiar de manera consistente.

Supongamos que hay tablas que representan publicaciones y su metainformaci贸n:

imagen

una transacci贸n lee de las tablas, otra las cambia:

imagen

Como resultado de la transacci贸n T1, la publicaci贸n tiene t铆tulo = Bueno y updated_by = T2, lo cual es una inconsistencia.

De hecho, esta es una lectura no repetible, pero como parte de varias tablas.

Para su correcci贸n, T1 puede bloquear bloqueos en todas las l铆neas que leer谩, lo que evitar谩 que T2 cambie la informaci贸n. En el caso de MVCC, la transacci贸n T2 se cancelar谩. La protecci贸n contra esta anomal铆a puede ser importante si usamos cursores.

Escribir sesgada


Esta anomal铆a tambi茅n es m谩s f谩cil de explicar usando un ejemplo: supongamos que en nuestro sistema al menos un m茅dico debe estar de servicio, pero ambos m茅dicos deciden cancelar su deber: la

imagen

imagen

anomal铆a ha llevado al hecho de que ninguno de los m茅dicos ir谩 a trabajar. 驴Por qu茅 pas贸 esto? Debido a que la transacci贸n verific贸 una condici贸n que podr铆a ser violada por otra transacci贸n, y debido al aislamiento, no vimos este cambio.

Esta es la misma lectura no repetible. Alternativamente, las selecciones pueden bloquear bloqueos en estos registros.

El sesgo de escritura y el sesgo de lectura son combinaciones de anomal铆as anteriores. Puede considerar escribir sesgo, que es esencialmente una lectura fantasma. Considere una tabla en la que hay nombres de empleados, su salario y el proyecto en el que trabajan:

imagen

imagen

Como resultado, obtenemos la siguiente imagen: cada gerente pens贸 que su cambio no conducir铆a al presupuesto, por lo que hicieron cambios de personal, lo que en total condujo a un desbordamiento.

La causa del problema es exactamente la misma que en la lectura fantasma.

recomendaciones


El debilitamiento del nivel de aislamiento de transacciones en la base de datos es un compromiso entre la seguridad y el rendimiento, la elecci贸n de este nivel debe abordarse en funci贸n de los riesgos potenciales para el negocio en caso de anomal铆as.



Aprende m谩s sobre el curso.



All Articles