¡Sobre la combinación de bloqueo optimista y confirmación de lectura (nivel de aislamiento de transacción) en mySql! ! ¡Pídele a Dios que me deje volar!
Generación de niveles de aislamiento
En el caso de ejecución en serie, el orden de modificación de los datos es fijo y predecible, pero en el caso de ejecución concurrente, la modificación de los datos no es posible. Predictivo, fluido. Para lograr resultados de modificación de datos fijos y predecibles bajo ejecución concurrente, se crean niveles de aislamiento.
Entonces, la función del nivel de aislamiento es equilibrar el acceso concurrente y la coherencia de los datos de la base de datos.
Cuatro niveles de aislamiento de transacciones
¿Lectura no confirmada? La lectura no confirmada puede leer datos no confirmados. Enviado para lectura. ¿Para lectura bloqueada (seleccione con para actualizar o compartir), actualizar y eliminar declaraciones? InnoDB solo bloquea los registros de índice, no los espacios entre ellos, por lo que permite insertar libremente nuevos registros junto a los registros bloqueados. ? El bloqueo de espacios solo se utiliza para la verificación de restricciones de clave externa y la verificación de claves duplicadas. Las lecturas repetibles se pueden leer repetidamente y las lecturas consistentes dentro de una transacción leen la instantánea creada por la primera lectura de la transacción. ¿Serializable? Serialización
Después de comprender los requisitos de los cuatro niveles de aislamiento, debemos comprender qué se está bloqueando (los datos en sí y la brecha) y comprender la configuración completa de todo el rango de datos.
Combinación completa de rangos de datos
La declaración SQL determina el rango de datos que no necesita ser escaneado (sin bloquear) según las condiciones;
Según De acuerdo con las condiciones del escaneo de la declaración SQL, puede ser El rango de datos que debe bloquearse;
Tome un solo rango de datos como ejemplo. El conjunto completo de rangos de datos incluye: (El rango de datos no necesariamente. constan de valores continuos, pero también pueden constar de valores de intervalo)
1 Los datos han llenado toda el área de datos: (el área de datos se ha llenado completamente, no hay espacios en los datos)
Dando forma, el rango de datos con la única restricción en el valor es 1 ~ 5,
Los datos existentes son 1, 2, 3, 4, 5. En este momento, el rango de datos ha sido completamente lleno;
En plástico, el rango de datos es 1 y 5, y existe una restricción única en el valor
Datos existentes 1, 5, el rango de datos ha sido completamente. lleno en este momento;?
2. Los datos han llenado parte del área de datos: (para el área de datos que no está completamente llena, hay un vacío de datos)
El rango de configuración de datos es 1. ~ 5,
Hay datos 1, 2, 3, 4, 5, pero debido a que no existe una restricción única,
el rango de datos puede continuar llenándose repetidamente con datos. de 1 a 5;
Dar forma, el único rango de datos restringido es 1 ~ 5,
Hay datos 2 y 5. En este momento, el rango de datos no está completamente lleno. y se pueden completar 1, 3 y 4
3. Datos No hay datos en el área (hay un espacio)
Como se muestra a continuación:
El rango de datos de conformación es 1 ~ 5 y actualmente no hay datos en el rango de datos.
Después de comprender la composición del conjunto de datos completo, veamos los problemas causados por la concurrencia de transacciones.
Problemas causados por concurrencia no controlada
Si las transacciones concurrentes no se controlan, causarán algunos problemas, entre los que se incluyen principalmente las siguientes situaciones.
1. Los cambios en los datos existentes en un alcance son causados por:
Actualizaciones perdidas: cuando varias transacciones seleccionan la misma fila y luego actualizan la fila según el valor seleccionado originalmente,
Debido a que todo desconoce la existencia de otras transacciones, la última actualización sobrescribirá las actualizaciones realizadas por otras transacciones.
Lectura sucia: una transacción está modificando un registro y la transacción es; cometido después de que se completa la transacción. Anteriormente, los registros estarían en un estado inconsistente.
En este momento, otra transacción también lee el mismo registro.
Si no se controla,
la segunda transacción lee estos datos "sucios" y realiza un procesamiento adicional basado en ellos, lo que resulta en una dependencia de datos comprometida.
Este fenómeno se llama "lectura sucia".
2. Los cambios en la cantidad de datos dentro del rango darán como resultado:
Lecturas no repetibles: una transacción vuelve a leer datos leídos previamente en algún momento después de leer algunos datos.
Sin embargo, se encontró que los datos leídos habían cambiado o que algunos registros se habían eliminado.
Este fenómeno se denomina “lectura no repetible”.
Lectura fantasma: una transacción vuelve a leer los datos recuperados previamente en función de las mismas condiciones de consulta.
Sin embargo, se descubrió que otras transacciones insertaban nuevos datos que cumplían con sus criterios de consulta. Este fenómeno se llama "lectura fantasma".
Se puede considerar simplemente que la cantidad de datos que cumplen las condiciones ha cambiado.
Porque la concurrencia incontrolada provocará una serie de problemas que conducirán a resultados insatisfactorios. Por lo tanto, necesitamos controlar la concurrencia para lograr el resultado deseado (nivel de aislamiento).
Implementación de niveles de aislamiento de MySQL
InnoDB admite estos niveles de aislamiento mediante estrategias de bloqueo.
Los bloqueos de fila incluyen:
Bloqueos de registros
Bloqueos de registros de índice, que siempre bloquean los registros de índice, incluso si no hay ningún índice definido en la tabla.
En este caso, InnoDB crea un índice agrupado oculto y lo utiliza para bloquear registros.
Bloqueo de espacio
El bloqueo de espacio es un bloqueo en el espacio entre registros de índice, o un bloqueo antes del primer registro o después del último registro.
El bloqueo de brechas es parte del equilibrio entre rendimiento y simultaneidad.
Las áreas de datos sin espacios no requieren bloqueos de espacios porque no hay espacios.
Bloqueo de tecla siguiente
Una combinación de un bloqueo de registro en el registro de índice y un bloqueo de espacio antes del registro de índice.
Supongamos que el índice contiene 10, 11, 13 y 20.
Los posibles bloqueos de siguiente tecla incluyen los siguientes rangos, donde los corchetes indican que los puntos finales del rango no están incluidos y los corchetes indican que los puntos finales del rango sí están incluidos:
(infinito negativo, 10)(10, 11) (11, 13) (13, 20) (20, infinito positivo) es el último.
Desliza hacia la izquierda o hacia la derecha para ver.
El pseudo registro "supermax" tiene un valor superior a cualquier valor real en el índice.
El supremum no es un registro de índice real, por lo que, de hecho, esta siguiente clave solo bloquea el espacio después del valor de índice máximo.
En base a esto, cuando el rango de datos obtenido haya llenado todos los rangos de datos, no habrá ningún espacio en este momento y no se requiere ningún bloqueo de espacio.
Si hay una brecha en el rango de datos, debe confirmar si desea bloquear la brecha de acuerdo con el nivel de aislamiento.
El nivel de aislamiento de lectura repetible predeterminado Para garantizar una lectura repetible, además de bloquear los datos en sí, también es necesario bloquear la brecha de datos.
Se ha leído READ COMMITTED y el bloqueo de registro de la fila no coincidente se libera después de que MySQL evalúe la condición Where.
Para las declaraciones de actualización, InnoDB realiza una lectura "semiconsistente" para devolver la última versión confirmada a MySQL.
Para que MySQL pueda determinar si la fila coincide con la condición donde actualizada.
Resumen; Extensión:
Los índices únicos tienen restricciones únicas, por lo que si se viola el principio de restricción única, los datos modificados fallarán.
Cuando una condición donde filtra datos usando un índice secundario, bloqueará las entradas alcanzadas por el índice secundario y el índice agrupado correspondiente, por lo tanto, cuando otras transacciones cambien el índice agrupado que alcanza el bloqueo, esperarán; Cerrar con llave.
El bloqueo de fila aumenta fila por fila, por lo que puede provocar un punto muerto en situaciones concurrentes.
Por ejemplo,
Cuando la sesión A bloquea el índice agrupado calificado, es posible que la sesión B ya tenga el bloqueo de registro del índice agrupado y la sesión B esté esperando que la sesión A mantenga el bloqueo de registro. El bloqueo de registro del índice agrupado.
La Sesión A y la Sesión B son índices agrupados posicionados por dos índices auxiliares no relacionados.
La sesión A pasa el índice idA, la sesión B pasa el índice idB.
Cuando no hay espacios en los datos obtenidos por la condición donde, no habrá bloqueo de espacios independientemente del nivel de aislamiento de rc o rr.
Por ejemplo, para obtener un rango de datos completamente poblado a través de un índice único, no se requiere ningún bloqueo de espacios.
El propósito de los bloqueos de espacios es evitar que se inserten datos en espacios, por lo que se bloqueará la presencia de datos en espacios, ya sea causados por cambios de inserción o actualización.
En el modo de aislamiento rc, las consultas y los escaneos de índice desactivan los bloqueos de espacios, que solo se utilizan para comprobaciones de restricciones de claves externas y comprobaciones de claves duplicadas (principalmente comprobaciones de unicidad).
En el modo rr, se agregará un bloqueo de espacio para evitar lecturas erróneas.
En una transacción, el bloqueo se agrega al comienzo del SQL y se libera al final de la transacción.
En lo que respecta a los tipos de bloqueo, debería haber bloqueos de optimización, actualizaciones de bloqueo, etc. Por ejemplo, si el modo rr no utiliza una consulta de índice, ¿se puede actualizar directamente al bloqueo de tabla?
En lo que respecta a los escenarios de aplicación de bloqueo, en los escenarios de reproducción, si se determina que las transacciones pueden ser concurrentes, puede considerar no bloquear para acelerar la reproducción.
Los bloqueos son solo una granularidad del control de concurrencia, solo una pequeña parte:
¿Necesita controlar la concurrencia desde diferentes escenarios (cambios conocidos en datos sin intersección y secuencia, en MySQL MTS? Reproducción simultánea de múltiples transacciones de la misma transacción anterior)
La granularidad del control de concurrencia (el bloqueo es una granularidad lógica, puede haber granularidad lógica o métodos como la capa física)
Optimización de la misma granularidad (el bloqueo en sí también está optimizado, como los bloqueos de optimización de tipo IX e IS)
La seguridad y el rendimiento de la carga granular (como adquirir bloqueos de página primero y luego bloqueos de fila, y liberar páginas después de adquirir bloqueos de fila) bloqueo, ya sea exitoso o no) y otros aspectos para pensar sobre la concurrencia.