Resulta que el mecanismo de bloqueo de MySQL se ve así

1. Clasificación de bloqueo

1. Dividir según las ideas

  1. El bloqueo optimista
    siempre es optimista. El bloqueo optimista cree que los datos no causarán conflictos en circunstancias normales, por lo que los conflictos de datos solo se detectarán cuando los datos se envíen para su actualización. CAS analógico
  2. El bloqueo pesimista
    siempre es pesimista: durante todo el proceso de procesamiento de datos, los datos están bloqueados. analogía sincronizada

2. Dividir por granularidad

  1. bloqueo de fila
  2. bloqueo de página
  3. cerradura de mesa

3. Dividir por tipo

  1. Bloqueo compartido (bloqueo de lectura)
  2. Bloqueo exclusivo (bloqueo de escritura)

2. MiISAM

1. Funciones de bloqueo

MyISAM usa bloqueos de tabla . Cuando MyISAM realiza operaciones de consulta y actualización , agregará bloqueos de lectura o escritura a todas las tablas involucradas.

2. Inserción concurrente

1. Instrucciones oficiales de inserción concurrente de MyISAM
Insertar descripción de la imagen aquí
2. Explicación

  • El motor de almacenamiento MyISAM admite la inserción simultánea para reducir la contención entre bloqueos de lectura y escritura.
  • Si no hay huecos entre los archivos de datos de la tabla (es decir, no hay datos eliminados en el medio), mientras ejecuta la instrucción SELECT , puede ejecutar la instrucción INSERT para agregar filas de datos al final de la tabla (es decir, concurrentes inserción )
  • Si hay varias declaraciones INSERT , se pondrán en cola y se ejecutarán secuencialmente, mientras se ejecuta la declaración SELECT . Es posible que los resultados de las inserciones simultáneas no sean visibles inmediatamente .

3. variable de sistema concurrent_insert

  • El valor predeterminado es AUTO (o 1), que admite la inserción simultánea sin agujeros.
  • NUNCA (o 0), desactiva las inserciones simultáneas
  • SIEMPRE (o 2), permite inserciones simultáneas al final de la tabla incluso para tablas con agujeros

4. Programación de bloqueo MyISAM

Para los motores de almacenamiento que solo usan bloqueos a nivel de tabla (como MyISAM , MEMORY y MERGE ), la prioridad del proceso de escritura es mayor que la del proceso de lectura . Aunque el proceso de lectura está al principio de la cola, la escritura El proceso también saltará a la cola .
Insertar descripción de la imagen aquí

  • Al establecer la variable del sistema actualizaciones de baja prioridad = 1, todas las instrucciones INSERT, UPDATE, DELETE y LOCK TABLE WRITE esperarán hasta que no haya operaciones de lectura SELECT o LOCK TABLE pendientes en la tabla afectada .
  • Reduzca la prioridad de la declaración especificando el atributo LOW_PRIORITY de la declaración INSERT, UPDATE y DELETE .

3.InnoDB

InnoDB admite bloqueos de fila y bloqueos de tabla

1. Clasificación por tipo de cerradura

  1. Cerraduras compartidas (S) y cerraduras exclusivas (X)

La transacción T1 mantiene el bloqueo compartido en la fila r . En este momento, la solicitud de otra transacción T2 para el bloqueo en la fila r se procesa de la siguiente manera:

  • El bloqueo S solicitado por la transacción T2 en la fila r se puede otorgar inmediatamente , por lo que tanto T1 como T2 obtendrán el bloqueo S en la fila r .
  • La solicitud de la transacción T2 para el bloqueo X en la fila r no se puede otorgar inmediatamente

Si la transacción T1 tiene un bloqueo exclusivo (X) en la fila r , entonces a una solicitud de otra transacción T2 no se le puede otorgar inmediatamente ningún tipo de bloqueo en la fila r . En este momento, la transacción T2 debe esperar a que la transacción T1 libere su bloqueo X en la fila r .

Es decir, compatible con lectura y lectura y lectura y escritura mutuamente excluyentes.

  1. bloqueo de intención

InnoDB admite bloqueos de granularidad múltiple, lo que permite que coexistan bloqueos de fila y bloqueos de tabla.

Para implementar el bloqueo en múltiples niveles de granularidad, InnoDB utiliza bloqueos de intención . Los bloqueos de intención son bloqueos a nivel de tabla que indican qué tipo de bloqueo ( compartido o exclusivo ) necesitará utilizar más adelante una transacción en una fila de la tabla .

  • El bloqueo de intención compartida (IS) indica que la transacción tiene la intención de establecer un bloqueo compartido
    en una sola fila de la tabla .
  • El bloqueo de intención exclusiva (IX) indica que la transacción tiene la intención de establecer un bloqueo exclusivo
    en una sola fila de la tabla .

La compatibilidad de bloqueo es la siguiente:

X IX S ES
X norte norte norte norte
IX norte Y norte Y
S norte norte Y Y
ES norte Y Y Y

  1. Bloqueos de registros Los bloqueos de filas bloquean los registros de índice al ejecutar el siguiente SQL:
SELECT id FROM student WHERE id = 1;

El índice con id=1 se bloqueará para evitar que otras transacciones lo inserten, actualicen o eliminen.

  1. Cerraduras de espacio

Un bloqueo de espacio es un bloqueo en el espacio entre registros de índice, o en el espacio antes del primer registro de índice o después del último registro de índice.

Por ejemplo,

SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 For UPDATE;

Si cualquier otra transacción inserta el valor 15 en la columna t.c1, no está permitido porque el espacio en el rango actual (10-20) ha sido bloqueado .

Cuando se realiza una búsqueda utilizando un índice único , no se producirán bloqueos de espacio. Si se realiza una búsqueda utilizando un índice conjunto , se producirán bloqueos de espacio.

Por ejemplo:

SELECT * FROM child WHERE id = 100;
  • Si la columna de identificación es el único índice, entonces la declaración anterior solo usa bloqueos de fila en la fila con id=100 y no se generará ningún bloqueo de espacio.
  • Si la columna de identificación no está indexada o hay un índice secundario, esta declaración bloqueará el espacio anterior

En el nivel de aislamiento READ COMMITED, los bloqueos de espacios están explícitamente deshabilitados.

  1. Cerraduras de siguiente llave

Los bloqueos de siguiente tecla son una combinación de bloqueos de registro y bloqueos de espacio

Ejemplo: cuando la transacción T1 agrega un bloqueo compartido o exclusivo a la fila r , también agrega un bloqueo de espacio al espacio antes de la fila r . En este momento, otra transacción T2 no puede insertar un nuevo registro de índice antes de la fila r . Supongamos que un índice contiene los valores 10, 11, 13 y 20. Los posibles bloqueos de siguiente tecla para este índice cubren el siguiente rango:

(-∞, 10]
(10, 11]
(11, 13]
(13, 20]
(20, +∞)
Para el último espacio, los bloqueos de tecla siguiente bloquean el espacio por encima del valor máximo en el índice y el "infinito positivo " "Registro ficticio, el valor de este pseudo registro es mayor que cualquier valor real en el índice. No es un registro de índice real, por lo que, de hecho, este bloqueo de siguiente clave solo bloquea el espacio después del valor máximo del índice .

De forma predeterminada, InnoDB opera en el nivel de aislamiento de transacciones REPEATABLE READ. En este caso, InnoDB utiliza bloqueos de siguiente tecla para búsquedas y escaneos de índice, lo que evita lecturas fantasmas.

referencias

Documentación oficial de MySQL
weblee
tianye_guazi

Supongo que te gusta

Origin blog.csdn.net/qq_41917138/article/details/114399059
Recomendado
Clasificación