Red de conocimiento informático - Consumibles informáticos - Algunas adiciones para bloquear los niveles de aislamiento

Algunas adiciones para bloquear los niveles de aislamiento

En resumen, los bloqueos de lectura bloquean las operaciones de escritura pero no las de lectura. Un bloqueo de escritura impedirá la lectura y la escritura.

Cuando ejecutamos la declaración actualizar/insertar/eliminar, mysql agregará automáticamente un bloqueo exclusivo a la declaración.

Bloqueo exclusivo: seleccione... para actualizar la declaración (use el bloqueo exclusivo para resolver la sobreventa)

Agregue * * * para disfrutar del bloqueo, puede usar seleccionar... para bloquear compartido declaración de modo.

Al usar el motor innodb, si no hay un campo de índice en la condición de filtro, toda la tabla se bloquea; de lo contrario, se bloqueará la fila correspondiente (debido a que el bloqueo de fila de InnoDB está establecido para el índice, no hay índice). se actualiza a un bloqueo de mesa).

SharedLock es similar a lockForUpdate en que evita que otras transacciones actualicen la misma fila de datos.

La diferencia es que SharedLock no impide que otras transacciones lean la misma fila.

lockForUpdate evitará que otras transacciones lean la misma fila (== Cabe señalar que las lecturas ordinarias sin bloqueo aún pueden leer la fila, solo se bloquearán las lecturas de SharedLock y LockForUpdate ==. )

InnoDB utiliza bloqueos de espacio para dos propósitos:

La única función de Gap Lock en InnoDB es evitar que se inserten otras transacciones, evitando así que se produzcan lecturas fantasmas.

Lecturas fantasma: el nivel de aislamiento es repetible para las líneas recién insertadas y las lecturas fantasma solo pueden aparecer en la lectura actual.

Pasos de ejecución

Porque no hay ningún registro con id=7 en la tabla:

Listar datos

Proceso de ejecución

= = ☆ ☆ ☆Requiere Atención☆ ☆ = =

En este caso, el bloqueo en modo compartido solo bloquea el índice de cobertura, pero si se usa para actualizaciones, es diferente. Al ejecutar la actualización, el sistema pensará que desea actualizar los datos a continuación, por lo que agregará un bloqueo de fila a las filas calificadas en el índice de clave principal, por lo que la sesión B también estará bloqueada y esperando.

Este ejemplo muestra el bloqueo que se agrega al índice al mismo tiempo, nos brinda una guía, si desea usar el bloqueo en modo compartido para agregar un bloqueo de lectura a la fila para evitar los datos; Para que no se actualice, debe omitir la optimización del índice, agregando un campo al campo de consulta que no existe en el índice. Por ejemplo, en modo compartido, cambie la declaración de consulta de la sesión A para seleccionar d de t donde c = 5 bloqueo. Puedes verificar el efecto tú mismo.

Listar datos

Proceso de bloqueo

Al comienzo de la ejecución, se debe encontrar la primera fila con id=10, por lo que el siguiente bloqueo de clave es ( 5, 10). De acuerdo con la optimización de 1, la condición equivalente en la identificación de la clave principal degenera en un bloqueo de fila, y solo se agrega el bloqueo de fila con id = 10, por lo que si donde = 10, entonces la fila de 10 está bloqueada.

La búsqueda de rango continuará en el futuro y la fila con id=15 se detendrá, por lo que es necesario agregar Next-KeyLock (10, 15) (la consulta equivalente degenerará en un bloqueo de espacio). .

Entonces, el rango de bloqueo de la sesión A en este momento es ID de bloqueo de línea = 10, bloqueo de siguiente tecla (10, 15), así que mire la sesión B y la sesión C.

Tenga en cuenta aquí que cuando la sesión A localiza la fila con id = 10, se considera una consulta equivalente. Cuando escanea hacia atrás para generar 15, se juzga según el rango.

Muestra un estado similar a "innodb_row_lock"

Especialmente cuando el número de esperas es grande y el tiempo de espera no es pequeño, debemos analizar por qué hay tantas esperas en el sistema y luego, según los resultados, comenzar a especificar planes de optimización.