Mecanismo de transacción y bloqueo de Mysql en el que no he trabajado durante cuatro años, ¡este artículo lo explica todo de una vez!

prefacio

Como todos sabemos, las transacciones y los bloqueos son funciones muy importantes en mysql, y también son el foco y la dificultad de las entrevistas. Este artículo presentará los conceptos relacionados y los principios de implementación de transacciones y bloqueos en detalle. Creo que después de leerlo, tendrá una comprensión más profunda de las transacciones y bloqueos.

Qué es una transacción

En Wikipedia, la definición de una transacción es: Una transacción es una unidad lógica en la ejecución de un sistema de gestión de base de datos (DBMS), que consta de una secuencia limitada de operaciones de base de datos .
inserte la descripción de la imagen aquí

Cuatro características de las transacciones

Las transacciones contienen cuatro características, a saber, Atomicidad , Consistencia , Aislamiento y Durabilidad (ACID).

  1. Atomicidad La atomicidad se refiere a una serie de operaciones en la base de datos, todas tienen éxito o todas fallan, y el éxito parcial es imposible . Tomando como ejemplo el escenario de la transferencia, el saldo de una cuenta disminuye y el saldo de la otra cuenta aumenta, estas dos operaciones deben tener éxito o fallar al mismo tiempo.
  2. Coherencia Coherencia significa que no se han violado las restricciones de integridad de la base de datos y que el estado de los datos es legal antes y después de que se ejecute la transacción . La coherencia aquí puede indicar que las restricciones de la base de datos en sí no se han destruido, como las restricciones de unicidad de ciertos campos, las restricciones de longitud de campo, etc.; también puede indicar restricciones comerciales en varios escenarios prácticos, como la operación de transferencia anterior, el monto reducido por una cuenta El monto agregado a la otra cuenta debe ser el mismo.
  3. Aislamiento El aislamiento se refiere al hecho de que múltiples transacciones están completamente aisladas entre sí y no interfieren entre sí . El propósito final del aislamiento también es garantizar la consistencia.
  4. Durabilidad Durabilidad significa que siempre que la transacción se confirme con éxito, los cambios realizados en la base de datos se guardan de forma permanente y es imposible volver al estado original por cualquier motivo .

el estado de la transacción

De acuerdo con las diferentes etapas de la transacción, la transacción se puede dividir aproximadamente en los siguientes cinco estados:

  1. Activo (active) Cuando se está ejecutando la operación de base de datos correspondiente a la transacción, la transacción está activa.
  2. Confirmado parcialmente Una transacción está confirmada parcialmente cuando se ha completado la última operación de la transacción, pero los cambios no se han vaciado en el disco.
  3. fallido (failed) Una transacción está en estado fallido cuando se encuentra en un estado activo o parcialmente comprometido y la transacción no puede continuar debido a algún error.
  4. Anulado (abortado) Cuando la transacción está en un estado fallido y la operación de reversión se completa, los datos se restauran al estado anterior a la ejecución de la transacción, la transacción está en estado abortado.
  5. comprometido (commited) Cuando la transacción está en el estado parcialmente comprometido y los datos modificados se han sincronizado con el disco, la transacción está en el estado comprometido.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-4pOb9nNv-1630936172502) (https://mp.toutiao.com/mp/agw/ article_material/open_image/get ?code=YzQ5MDBkYTEwODVhNmJiOTg2ZWM3MjQwOTFhNDQ5MDIsMTYzMDkzNjAzNTYwNA==)]

Nivel de aislamiento de transacciones

Como se mencionó anteriormente, las transacciones deben ser aisladas. La forma más sencilla de lograr el aislamiento es no permitir transacciones concurrentes, y cada transacción se pone en cola para su ejecución, pero el rendimiento de este método es demasiado bajo. Para equilibrar el aislamiento y el rendimiento de las transacciones, las transacciones admiten diferentes niveles de aislamiento.

Para facilitar la expresión del contenido posterior, primero creamos un héroe de tabla de ejemplo.

CREATE TABLE hero (
    number INT,
    name VARCHAR(100),
    country varchar(100),
    PRIMARY KEY (number)
) Engine=InnoDB CHARSET=utf8;
1.2.3.4.5.6.

Problemas encontrados en la ejecución concurrente de transacciones

Cuando las transacciones se ejecutan simultáneamente, sin ningún control, pueden ocurrir los siguientes 4 tipos de problemas:

  • La escritura sucia hace referencia a una transacción que modifica datos que no han sido confirmados por otras transacciones .

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-4hjUhH3g-1630936172505) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=M2ZhMmYzZWEwMGRkZDQwZGQ1ZjU4YTM1MDk2ZmM2NWUsMTYzMDkzNjAzNTYwNA==)]

Como se muestra en la figura anterior, la Sesión A y la Sesión B abren una transacción. La transacción en la Sesión B primero actualiza la columna de nombre del registro cuyo número aparece como 1 a 'Guan Yu', y luego la transacción en la Sesión A luego agrega el número como la columna.La columna de nombre del registro de 1 se actualiza a Zhang Fei. Si la transacción en la sesión B se revierte más tarde, ya no existirá la actualización en la sesión A. Este fenómeno se denomina escritura sucia .

  • Lectura sucia se refiere a una transacción que lee datos no confirmados por otras transacciones .

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-jfxoIvuJ-1630936172509) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=NzA0N2UzNTE2YTk4ZTFkMzUxNDAwZjgwZGI3MTdlNTAsMTYzMDkzNjAzNTYwNQ==)]

Como se muestra en la figura anterior, la Sesión A y la Sesión B han abierto cada una una transacción. La transacción en la Sesión B primero actualiza la columna de nombre del registro cuyo número aparece como 1 a 'Guan Yu', y luego la transacción en la Sesión A consulta que el número es 1. Si el valor del nombre de la columna se lee como 'Guan Yu', y la transacción en la Sesión B se revierte más tarde, entonces la transacción en la Sesión A es equivalente a leer datos inexistentes, esto Se llama fenómeno para lecturas sucias .

  • Lectura no repetible (Lectura no repetible) La lectura no repetible se refiere a la lectura de datos enviados por otras transacciones durante la ejecución de una transacción, lo que da como resultado resultados inconsistentes de dos lecturas .

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-Yhzpmr1o-1630936172515) (https://mp.toutiao.com/mp/agw/ article_material/open_image/get ?code=ZDFkMzhmODI1MmMxMjgyODU3Y2U1ODg0NzQ2NzhkNjgsMTYzMDkzNjAzNTYwNQ==)]

Como se muestra en la figura anterior, hemos enviado varias transacciones implícitas en la Sesión B (mysql agregará automáticamente transacciones para las declaraciones de adición, eliminación y modificación), y estas transacciones han modificado el valor del nombre de la columna del registro cuya columna de número es 1. Después de enviar cada transacción, si todas las transacciones en la sesión A pueden ver el valor más reciente, este fenómeno también se denomina lectura no repetible .

  • La lectura fantasma se refiere al hecho de que durante la ejecución de una transacción, se leen los datos recién insertados por otras transacciones, lo que da como resultado resultados inconsistentes de dos lecturas .

[La transferencia de la imagen del enlace externo falló, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y cargarla directamente (img-p2DDfWkh-1630936172520) (https://mp.toutiao.com/mp/agw/ article_material/open_image/get ?code=NDc3ZmY5NDllODM0NTBiNDJiNGVmZWFjNDg3OWUwMDYsMTYzMDkzNjAzNTYwNQ==)]

Como se muestra en la figura anterior, la transacción en la Sesión A primero consulta al héroe de la tabla de acuerdo con el número de condición > 0 y obtiene un registro cuyo valor de columna de nombre es 'Liu Bei'; luego se envía una transacción implícita en la Sesión B y la transacción se inserta en el héroe de la tabla Después de eso, la transacción en la Sesión A consulta al héroe de la tabla de acuerdo con el mismo número de condición > 0, y el conjunto de resultados contiene el registro recién insertado por la transacción en la Sesión B. Este fenómeno también se denomina lectura fantasma. .

La diferencia entre lecturas no repetibles y lecturas fantasmas es que las lecturas no repetibles leen datos modificados o eliminados por otras transacciones, mientras que las lecturas fantasmas leen datos recién insertados por otras transacciones.

El problema de las escrituras sucias es tan grave que cualquier nivel de aislamiento debe evitarlo. Ya sea lectura sucia, lectura no repetible o lectura fantasma, todas pertenecen al problema de la consistencia de lectura de la base de datos, que son inconsistencias entre las dos lecturas antes y después de una transacción.

Cuatro niveles de aislamiento

Se establecen cuatro niveles de aislamiento en el estándar SQL para resolver el problema de coherencia de lectura anterior. Diferentes niveles de aislamiento pueden resolver diferentes problemas de consistencia de lectura.

  • LECTURA NO COMPROMETIDA: lectura no confirmada.
  • LECTURA COMPROMETIDA: La lectura ha sido confirmada.
  • LECTURA REPETIBLE: lectura repetible.
  • SERIALIZABLE: serializar.

Los problemas de consistencia de lectura que pueden ocurrir en cada nivel de aislamiento son los siguientes:

nivel de aislamiento lectura sucia lectura no repetible alucinaciones
LEER SIN COMPROMISO posible posible posible
LEER COMPROMETIDO imposible posible posible
LECTURA REPETIBLE imposible imposible posible (no posible con InnoDB)
Serialización (SERIALIZABLE) imposible imposible imposible

InnoDB admite cuatro niveles de aislamiento (básicamente consistentes con los definidos por el estándar SQL). Cuanto mayor sea el nivel de aislamiento, menor será la concurrencia de transacciones. La única diferencia es que InnoDB resuelve el problema de las lecturas fantasma en el nivel de LECTURA REPETIBLE . Esta es la razón por la que InnoDB utiliza la lectura repetible como nivel de aislamiento predeterminado para las transacciones.

MVCC

MVCC (Control de concurrencia de múltiples versiones), el nombre chino es control de concurrencia de múltiples versiones, en términos simples, es para resolver el problema de la consistencia de lectura bajo acceso concurrente manteniendo la versión histórica de los datos.

cadena de versiones

En InnoDB, cada registro de fila en realidad contiene dos campos ocultos: ID de transacción (trx_id) y puntero de reversión (roll_pointer).

  1. trx_id: identificación de la transacción. Cada vez que se modifica una fila de registros, la identificación de la transacción se asigna a la columna oculta trx_id.
  2. roll_pointer: puntero de reversión. Cada vez que se modifica una fila de registros, la dirección del registro de deshacer se asigna a la columna oculta roll_pointer.

Supongamos que solo hay una fila de registros en la tabla de héroes y la identificación de la transacción insertada en ese momento es 80. En este punto, un diagrama de ejemplo del registro es el siguiente:

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-FfHa46YR-1630936172527) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=NWI1NTE4NmNhOTA1NDJjMTc3MWI4MzdlZGE3MGMwMDAsMTYzMDkzNjAzNTYwNg==)]

Suponga que las siguientes dos transacciones con identificadores de transacción de 100 y 200, respectivamente, realizan una operación de ACTUALIZACIÓN en este registro. El proceso de la operación es el siguiente:

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-sMc7bF46-1630936172533) (https://mp.toutiao.com/mp/agw/ article_material/open_image/get ?code=YjYzNDQzMGRkMDYwZGMwOWFhZjY5MWNjZDQwOGFkOWEsMTYzMDkzNjAzNTYwNg==)]

Porque cada cambio registrará primero el registro de deshacer y usará roll_pointer para apuntar a la dirección del registro de deshacer. Por lo tanto, se puede considerar que los registros de modificación de este registro están conectados en serie para formar una cadena de versión, y el nodo principal de la cadena de versión es el valor más reciente del registro actual . como sigue:

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-0aRqP4rl-1630936172536) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=ZmJiZGE3ZDQwNmU4M2Q5ZGEzNGY4M2Y1ODZlODY1YzMsMTYzMDkzNjAzNTYwNw==)]

Vista de lectura

Si el nivel de aislamiento de la base de datos es LECTURA NO COMPROMETIDA, se puede leer la última versión del registro en la cadena de versiones. Si es serialización (SERIALIZABLE), las transacciones se ejecutan con bloqueos, y no hay problema de inconsistencia de lectura. Sin embargo, si se trata de una lectura confirmada (LECTURA COMPROMETIDA) o una lectura repetible (LECTURA REPETIBLE), es necesario recorrer cada registro en la cadena de versión para determinar si el registro es visible para la transacción actual hasta que se encuentre (si no se encuentra después de completar el recorrido) El registro de descripción no existe) . InnoDB implementa esta funcionalidad a través de ReadView. ReadView contiene principalmente los siguientes 4 contenidos:

  • m_ids: una lista de ID de transacciones que representan transacciones de lectura y escritura que están activas en el sistema actual cuando se genera ReadView.
  • min_trx_id: indica el id de transacción más pequeño en las transacciones activas de lectura y escritura en el sistema actual cuando se genera ReadView, es decir, el valor más pequeño en m_ids.
  • max_trx_id: Indica el valor de id que se debe asignar a la siguiente transacción en el sistema cuando se genera ReadView .
  • author_trx_id: indica el id de la transacción que generó la transacción ReadView.

Con ReadView, podemos determinar si una versión del registro es visible para la transacción actual según los siguientes pasos.

  1. Si el valor del atributo trx_id de la versión a la que se accede es el mismo que el valor de created_trx_id en ReadView, significa que la transacción actual está accediendo a su propio registro modificado, por lo que la transacción actual puede acceder a esta versión.
  2. Si el valor del atributo trx_id de la versión a la que se accede es menor que el valor min_trx_id en ReadView, indica que la transacción que generó esta versión se ha confirmado antes de que la transacción actual genere ReadView, por lo que la transacción actual puede acceder a esta versión.
  3. Si el valor del atributo trx_id de la versión a la que se accede es mayor o igual que el valor max_trx_id en ReadView, indica que la transacción que genera esta versión se abre después de que la transacción actual genera ReadView, por lo que la transacción actual no puede acceder a esta versión. transacción.
  4. Si el valor del atributo trx_id de la versión accedida está entre min_trx_id y max_trx_id de ReadView, entonces es necesario juzgar si el valor del atributo trx_id está en la lista m_ids, no se puede acceder, si no, significa que la transacción que generó la versión cuando se ha creado ReadView y se puede acceder a la versión.

En MySQL, una diferencia muy grande entre los niveles de aislamiento de LECTURA COMPROMETIDA y LECTURA REPETIBLE es el momento en que generan el ReadView. READ COMMITTED generará un ReadView antes de cada lectura de datos , para garantizar que los datos enviados por otras transacciones se puedan leer cada vez. REPEATABLE READ solo genera un ReadView cuando lee datos por primera vez , por lo que se puede garantizar que los resultados de las lecturas posteriores sean completamente consistentes.

Cerrar con llave

Las transacciones que acceden al mismo recurso de datos al mismo tiempo se dividen principalmente en tres tipos: lectura-lectura, escritura-escritura y lectura-escritura.

  1. Lectura-lectura son transacciones simultáneas que acceden a la misma fila de registros de datos al mismo tiempo. Dado que ambas transacciones son de solo lectura y no afectan los registros, las lecturas simultáneas están totalmente permitidas.
  2. Escritura-escritura significa que las transacciones simultáneas modifican la misma fila de registros de datos al mismo tiempo. En este caso, puede dar lugar al problema de escritura sucia, que no está permitida bajo ninguna circunstancia, por lo que solo se puede lograr mediante el bloqueo, es decir, cuando una transacción necesita modificar una fila de registros, primero dará este Bloqueo, si el bloqueo es exitoso, continúe con la ejecución, de lo contrario, espere en línea, la transacción liberará automáticamente el bloqueo cuando la transacción se complete o se revierta.
  3. Lectura-escritura significa que una transacción realiza la operación de lectura y la otra realiza la operación de escritura. En este caso, pueden ocurrir lecturas sucias, lecturas no repetibles y lecturas fantasma. La mejor solución es utilizar el control de concurrencia de varias versiones (MVCC) para las operaciones de lectura y el bloqueo para las operaciones de escritura .

granularidad de bloqueo

De acuerdo con el alcance de los datos de la función de bloqueo, el bloqueo se puede dividir en bloqueo de nivel de fila y bloqueo de nivel de tabla.

  1. Bloqueos a nivel de fila: al actuar sobre las filas de datos, la granularidad de los bloqueos es relativamente pequeña.
  2. Bloqueo a nivel de tabla: actúa sobre toda la tabla de datos y la granularidad del bloqueo es relativamente grande.

Clasificación de cerraduras

Para lograr que la lectura-lectura no se vea afectada, y que la escritura-escritura y la lectura-escritura puedan bloquearse entre sí, Mysql usa la idea de bloqueos de lectura-escritura para implementar, específicamente, se divide en bloqueos compartidos y bloqueos exclusivos:

  1. Bloqueos compartidos: denominados bloqueos S, cuando una transacción desea leer un registro, primero debe adquirir el bloqueo S del registro. Los bloqueos S pueden ser retenidos por múltiples transacciones al mismo tiempo. Podemos añadir manualmente un bloqueo S seleccionando... bloquear en modo compartir;.
  2. Bloqueos exclusivos (Exclusive Locks): denominados bloqueos X, cuando una transacción desea cambiar un registro, primero debe obtener el bloqueo X del registro. Los bloqueos X solo pueden ser retenidos por una transacción a la vez como máximo. Hay dos formas de bloquear el bloqueo X. La primera es el bloqueo automático. Al agregar, eliminar o modificar datos, se agregará un bloqueo X por defecto. Otro es el bloqueo manual. Usamos FOR UPDATE para agregar un bloqueo X a una fila de datos.

También se debe tener en cuenta que si una transacción ya tiene un bloqueo S en una fila de registros, otra transacción no puede agregar un bloqueo X a esta fila de registros y viceversa.

Además de bloqueos compartidos y bloqueos exclusivos, Mysql también tiene bloqueos de intención. El bloqueo de intención lo mantiene la propia base de datos. En términos generales, antes de agregar un bloqueo compartido a una fila de datos, la base de datos agregará automáticamente un bloqueo compartido de intención (bloqueo IS) a esta tabla; cuando agregamos un bloqueo exclusivo a una fila de datos Antes del bloqueo, la base de datos agregará automáticamente un bloqueo exclusivo intencional (bloqueo IX) en esta tabla. El bloqueo intencional se puede considerar como la identificación del bloqueo S y el bloqueo X en la tabla de datos. A través del bloqueo intencional, puede determinar rápidamente si hay un registro bloqueado en la tabla, para evitar verificar si hay un registro bloqueado. la mesa atravesándola Eficiencia de bloqueo . Por ejemplo, queremos agregar un bloqueo X de nivel de tabla. En este momento, si hay un bloqueo X de nivel de fila o un bloqueo S en la tabla de datos, el bloqueo fallará. En este momento, puede saber si esta tabla tiene un nivel de fila directamente basado en la intención de bloqueo X lock o S lock.

Bloqueos a nivel de tabla en InnoDB

Los bloqueos de nivel de tabla en InnoDB incluyen principalmente bloqueos compartidos intencionales de nivel de tabla (bloqueos IS), bloqueos exclusivos intencionales (bloqueos IX) y bloqueos de aumento automático (bloqueos AUTO-INC). Entre ellos, los bloqueos IS y los bloqueos IX se han introducido anteriormente, por lo que no los repetiré aquí. Centrémonos en los bloqueos AUTO-INC.

Como todos sabemos, si agregamos el atributo de autoincremento AUTO_INCREMENT a un campo de columna, no es necesario especificar un valor para el campo al insertar, y el sistema garantizará automáticamente el incremento. Hay dos principios principales para que el sistema asigne automáticamente asignaciones incrementales a las columnas modificadas con AUTO_INCREMENT:

  1. Bloqueo AUTO-INC: el bloqueo AUTO-INC a nivel de tabla se agrega cuando se ejecuta la declaración de inserción, y el bloqueo se libera inmediatamente después de que se completa la ejecución de inserción. Si nuestra declaración de inserción no puede determinar cuántos registros insertar antes de la ejecución, como una declaración de inserción como INSERTAR ... SELECCIONAR, generalmente se usa el bloqueo AUTO-INC .
  2. Bloqueo ligero: el bloqueo ligero se adquiere primero cuando la declaración de inserción genera el valor AUTO_INCREMENT, y luego se libera el bloqueo ligero después de generar el valor AUTO_INCREMENT. Si nuestra declaración de inserción puede determinar cuántos registros insertar antes de que se ejecute, generalmente se usa un bloqueo ligero para asignar valores a las columnas modificadas por AUTO_INCREMENT . Este método evita bloquear la mesa y mejora el rendimiento de la inserción.

De forma predeterminada, mysql selecciona automáticamente el método de bloqueo de acuerdo con la escena real. Por supuesto, también puede forzar el uso de uno solo de ellos a través de innodb_autoinc_lock_mode.

Bloqueos de nivel de fila en InnoDB

Como se mencionó anteriormente, MVCC puede resolver los problemas de consistencia de lectura de lecturas sucias, lecturas no repetibles y lecturas fantasma, pero de hecho, esto solo resuelve el problema de lectura de datos de declaraciones de selección ordinarias. La operación de lectura realizada por una transacción que utiliza MVCC se denomina lectura instantánea.Todas las instrucciones SELECT ordinarias se consideran lecturas instantáneas en los niveles de aislamiento LECTURA COMPROMETIDA y LECTURA REPETIBLE. Además de la lectura de instantáneas, también hay una lectura de bloqueo, es decir, bloquea el registro al leer y aún necesita resolver los problemas de lectura sucia, lectura no repetible y lectura fantasma en el caso de lectura bloqueada. Dado que todos están bloqueados en registros, estos bloqueos son todos bloqueos de nivel de fila.

El bloqueo de fila de InnoDB se logra bloqueando el índice. Si el índice no se usa durante la consulta de bloqueo, todo el índice agrupado se bloqueará, lo que equivale a bloquear la tabla . Según el rango de bloqueo, los bloqueos de fila se pueden implementar mediante bloqueos de registros, bloqueos de intervalos y bloqueos de tecla siguiente. Supongamos que ahora hay una tabla t, la clave principal es id. Insertamos 4 filas de datos con valores de clave principal de 1, 4, 7 y 10. A continuación, tomaremos el índice agrupado como ejemplo para presentar en detalle tres formas de bloqueos de fila.

  • Bloqueos de registros El llamado registro se refiere a los datos realmente almacenados en el índice agrupado. Por ejemplo, 1, 4, 7 y 10 anteriores son todos registros.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y cargarla directamente (img-IhkzklLT-1630936172540) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=YTViY2Y1ODZkNTViODg4MmI4MjdiNDlkNTBmMThlYmUsMTYzMDkzNjAzNTYwNw==)]

Obviamente, un bloqueo de registro consiste en bloquear directamente una fila de registros. Cuando usamos un índice único (incluido el índice único y el índice agrupado) para realizar una consulta de igual valor y hacer coincidir exactamente un registro, el registro se bloqueará directamente en este momento. Por ejemplo, seleccione * de t donde id = 4 para actualizar; bloqueará el registro con id = 4.

  • Gap Locks Gap hace referencia a la parte entre dos registros que no se ha llenado lógicamente con datos, como los anteriores (1,4), (4,7), etc.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-PlYD434v-1630936172547) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=OGEyYmZiMGJmNTY0NWMyMjg3YzQzYmQ3YzUyMDY5NjcsMTYzMDkzNjAzNTYwNw==)]

De la misma manera, el bloqueo de espacios sirve para bloquear ciertos intervalos de espacios. Cuando usamos una consulta equivalente o una consulta de rango y no se alcanza ningún registro, el intervalo de brecha correspondiente se bloqueará. Por ejemplo, seleccione * de t donde id = 3 para actualizar; o seleccione * de t donde id > 1 e id < 4 para actualizar; bloqueará el intervalo (1,4).

  • Bloqueos de tecla siguiente Los bloqueos de tecla siguiente se refieren al intervalo abierto a la izquierda y cerrado a la derecha compuesto por el espacio más el registro a su derecha. Como los anteriores (1,4], (4,7] y así sucesivamente.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y subirla directamente (img-ggGeT4Tu-1630936172554) (https://mp.toutiao.com/mp/agw/ artículo_material/open_image/get ?code=NTU4YTZkYmU3ZWMyMGJlMGRkMGJjYmNjM2M2NjJiNGISMTYzMDkzNjAzNTYwNw==)]

Pro-key lock es una combinación de Record Locks y Gap Locks, es decir, además de bloquear el registro en sí, también bloquea el espacio entre los índices. Cuando usamos una consulta de rango y alcanzamos algunos registros, el rango clave está bloqueado en este momento. Tenga en cuenta que el rango bloqueado por el bloqueo de teclas incluirá el rango de teclas a la derecha del último registro. Por ejemplo, seleccione * from t donde id > 5 e id <= 7 para actualizar; bloqueará (4,7], (7,+∞). El tipo de bloqueo de fila predeterminado de mysql es Next-Key Locks. índice único, cuando la consulta equivalente coincide con un registro, los bloqueos de tecla siguiente degenerarán en un bloqueo de registro; cuando no haya coincidencias de registros, degenerará en un bloqueo de brecha.

Gap Locks y Next-Key Locks se utilizan para resolver el problema de lectura fantasma.Bajo el nivel de aislamiento LECTURA COMPROMETIDA, Gap Locks y Next-Key Locks -Key Locks) no serán válidos.

Supongo que te gusta

Origin blog.csdn.net/m0_48795607/article/details/120145693
Recomendado
Clasificación