mecanismo de bloqueo mysql bloqueo optimista y bloqueo pesimista, bloqueo compartido y bloqueo exclusivo y bloqueo de intención y bloqueo de espacio

Directorio

Cerradura optimista y cerradura pesimista

Cerradura pesimista

Bloqueo pesimista: la realización en la tabla de datos

Pensamiento pesimista con bloqueo extendido

Bloqueo optimista

Implementación de bloqueo optimista en la tabla de datos

Granularidad optimista de bloqueo de bloqueo de bloqueo optimista

Entrenamiento optimizado con bloqueo extendido

Resumen optimista y bloqueo pesimista: resumen pequeño

Bloqueo compartido y bloqueo exclusivo y bloqueo de intención y bloqueo de autorización

Cerradura exclusiva y cerradura compartida

Cerraduras compartidas (cerraduras compartidas, cerraduras S)

Cerraduras exclusivas (cerraduras X)

Intención de bloqueo

Cerraduras de intención

Uso de bloqueo intencional

Bloqueo de separación

Condiciones para el bloqueo de espacio

El papel de la brecha


Nota: Este artículo hace referencia a   https://www.jianshu.com/p/904f52bde904

Cerradura optimista y cerradura pesimista

El control de concurrencia optimista y el control de concurrencia pesimista son los principales métodos adoptados por el control de concurrencia. El bloqueo optimista y el bloqueo pesimista no solo se aplican en bases de datos relacionales, sino que también tienen conceptos relacionados en Hibernate, Memcache, etc.

Cerradura pesimista

En la arquitectura actual de Internet de alta concurrencia, el bloqueo pesimista se ha vuelto muy raro debido al impacto del pensamiento rápido.

Bloqueo pesimista (bloqueo pesimista), el bloqueo pesimista se refiere al proceso de procesamiento de datos, de modo que los datos están en un estado bloqueado, generalmente utilizando el mecanismo de bloqueo de la base de datos para lograrlo.

Bloqueo pesimista: la realización en la tabla de datos

Para utilizar el bloqueo pesimista en MySQL, debe desactivar la confirmación automática de MySQL, establecer la confirmación automática = 0, MySQL usa el modo de confirmación automática de forma predeterminada, es decir, si realiza una operación de actualización, MySQL enviará automáticamente los resultados.

Tome una castaña:
suponga que hay una cantidad de campo en la tabla de productos para indicar el inventario actual del producto. Supongamos que hay un manguito Dulex con una identificación de 100 y cantidad = 8; si no se usa bloqueo, entonces el método de operación

Como sigue:

//step1: 查出商品剩余量
 select quantity from items where id=100;
//step2: 如果剩余量大于0,则根据商品信息生成订单
 insert into orders(id,item_id) values(null,100);
 //step3: 修改商品的库存
 update Items set quantity=quantity-1 where id=100;

Esta forma de escribir es realmente normal en un pequeño taller, sin problemas, pero los problemas pueden ocurrir en un entorno de alta concurrencia.

Como sigue:

 

De hecho, en el enlace ① o ②, alguien ya ha realizado un pedido y reducido el inventario. En este momento, el paso 3 todavía se ejecuta, lo que provoca una sobreventa .

Pero el uso de bloqueos pesimistas puede resolver este problema. En el escenario anterior, la información del producto es de consulta a modificación, hay un proceso para generar pedidos en el medio, el principio de usar bloqueos pesimistas es que cuando consultamos información de artículos Los datos actuales están bloqueados hasta que los modifiquemos y luego los desbloqueemos. Luego, en este proceso, debido a que los datos están bloqueados, no habrá un tercero que los modifique. La premisa de esto es que la instrucción SQL que se ejecutará debe colocarse en la misma cosa, de lo contrario no se puede lograr el propósito de bloquear la fila de datos.

Como sigue:

//step1: 查出商品状态
select quantity from items where id=100 for update;
//step2: 根据商品信息生成订单
insert into orders(id,item_id) values(null,100);
//step3: 修改商品的库存
update Items set quantity=quantity-2 where id=100;

seleccione ... para actualizar es un método proporcionado por MySQL para lograr un bloqueo pesimista. En este momento, en la tabla de artículos, los datos con la identificación de 100 están bloqueados por nosotros. Otras transacciones que necesitan ejecutar seleccione una cantidad de artículos donde id = 100 para la actualización deben esperar a que se ejecute esta transacción. De esta manera podemos garantizar que los datos actuales no serán modificados por otras transacciones.

Pensamiento pesimista con bloqueo extendido

Cabe señalar que cuando ejecuto seleccionar cantidad de artículos donde id = 100 para la actualización. Si ejecuto una cantidad selecta de artículos donde id = 100 (sin actualización) en la segunda transacción, los datos aún pueden consultarse normalmente y no se verán afectados por la primera transacción. Además, MySQL también tiene el problema de que todas las filas escaneadas se bloquearán durante la ejecución de la instrucción select ... for update, por lo que el uso del bloqueo pesimista en MySQL debe garantizar que el índice desaparezca, no el escaneo completo de la tabla, de lo contrario lo hará. Bloquee toda la tabla de datos .

El bloqueo pesimista no es adecuado para ninguna escena, también tiene algunas deficiencias, ya que el bloqueo pesimista depende principalmente del mecanismo de bloqueo de la base de datos para garantizar el máximo grado de exclusividad. Si el tiempo de bloqueo es demasiado largo, otros usuarios no pueden acceder a él durante mucho tiempo, lo que afecta el acceso concurrente del programa.Al mismo tiempo, esto también tiene un gran impacto en la sobrecarga del rendimiento de la base de datos, especialmente para transacciones largas, tal sobrecarga a menudo es insoportable. Se requiere un bloqueo optimista.

Bloqueo optimista

En comparación con los bloqueos pesimistas, los bloqueos optimistas creen que los datos no causarán conflictos en circunstancias normales, por lo que cuando los datos se envían para su actualización, verificará formalmente si los datos entran en conflicto. Si se encuentra un conflicto, devolverá un mensaje de error. Permitir a los usuarios decidir cómo hacerlo. A continuación, analizamos la implementación del bloqueo optimista en tablas de datos y cachés.

Implementación de bloqueo optimista en la tabla de datos

El uso del mecanismo de número de versión de datos (versión) es una de las implementaciones de bloqueo optimista más utilizadas. Generalmente, al agregar un campo de "versión" de tipo numérico a la tabla de la base de datos , cuando se leen datos, el valor del campo de versión se lee en conjunto. Cada vez que se actualizan los datos, el valor de la versión es +1 . Cuando enviamos una actualización, la información de la versión actual del registro correspondiente en la tabla de la base de datos se compara con el valor de la versión recuperada por primera vez. Si el número de versión actual de la tabla de la base de datos es igual al valor de la versión recuperada por primera vez, se actualizará. De lo contrario, se consideran datos obsoletos y la actualización falla.

Dar una castaña

//step1: 查询出商品信息
select (quantity,version) from items where id=100;
//step2: 根据商品信息生成订单
insert into orders(id,item_id) values(null,100);
//step3: 修改商品的库存
update items set quantity=quantity-1,version=version+1 where id=100 and version=#{version};

Como puede usar la versión , también puede usar el campo de marca de tiempo . Este método también agrega un campo de marca de tiempo a la tabla. Similar a la versión anterior, también verifica la marca de tiempo de los datos en la base de datos actual cuando se envía la actualización y antes de la actualización Compare las marcas de tiempo obtenidas, si son consistentes, entonces OK, de lo contrario es un conflicto de versión.

Debe tenerse en cuenta que si su tabla de datos es una tabla separada para lectura y escritura, cuando los datos escritos en la tabla maestra no se sincronizan con la tabla esclava a tiempo, la actualización siempre fallará. En este momento, debe forzar la lectura de los datos en la tabla maestra (poner la instrucción select en las cosas).

Es decir: ¡ ponga la instrucción select en la transacción y consulte la biblioteca maestra!

Granularidad optimista de bloqueo de bloqueo de bloqueo optimista

El bloqueo optimista se usa ampliamente para la sincronización de estado en nuestro sistema de aves . A menudo encontramos escenarios en los que el estado de una orden logística se modifica simultáneamente, por lo que el bloqueo optimista juega un papel muy importante en este momento.

Comparta un caso de bloqueos optimistas cuidadosamente seleccionados para reducir el rango de bloqueo

Cuando se deduce el inventario de productos, especialmente en escenarios con alta concurrencia, como picos y rentabilidad, si el número de versión se utiliza como un bloqueo optimista, solo una transacción puede actualizarse con éxito a la vez, y la percepción empresarial es un gran número de operaciones fallidas.

// 仍挑选以库存数作为乐观锁
//step1: 查询出商品信息
select (inventory) from items where id=100;
//step2: 根据商品信息生成订单
insert into orders(id,item_id) values(null,100);
//step3: 修改商品的库存
update items set inventory=inventory-1 where id=100 and inventory-1>0;

Eso es correcto! Has participado en Tmall, Taobao spike y has conseguido un buen negocio. Este es el SQL . Al seleccionar bloqueos optimistas, puedes reducir la fuerza de bloqueo y mejorar el rendimiento ~

El bloqueo optimista debe usarse con flexibilidad

En la arquitectura actual de Internet de alta concurrencia, el bloqueo pesimista se ha vuelto muy raro debido al impacto del pensamiento rápido.

Entrenamiento optimizado con bloqueo extendido

En muchos sistemas en Ali, puede ver características, parámetros y otros campos de uso común. Si estos campos no están versionados, es muy fácil tener problemas de cobertura de información en escenarios concurrentes.

Por ejemplo:

Hilo Características originales Características objetivo
ejército de reserva a = 1; a = 1; b = 1;
tuberculosis a = 1; a = 1; c = 1;

Esperamos que el resultado de la actualización final sea:

a = 1; b = 1; c = 1;

Si SQL está escrito en este momento

update    
    lg_order
set    
    features=#features#
where    
    order_id=#order_id#

Entonces, como el orden de TA y TB es diferente, el resultado que obtenemos puede ser a = 1; b = 1; o a = 1; c = 1;

Si usa el bloqueo optimista en este momento y usa la versión de campo global para el procesamiento, encontrará que hay una tasa de conflicto muy alta con otros campos de lg_order porque el campo de versión es global

¿Cómo lidiar con eso? ? ?

Inteligente, encontrará que al diseñar tablas de biblioteca en general, todo con un campo de características similar tendrá un feature_cc emparejado con él. Muchos programadores más jóvenes en la fábrica rara vez prestan atención a este campo, y hemos tratado de corregirlo durante mucho tiempo. Debería ser mucho mejor ahora.

La función de features_cc es controlar la versión de bloqueo optimista de las características, evitando así la vergüenza de usar conflictos de versiones con todo el campo.

update    
    lg_order
set    
    features=#features#,    
    features_cc= features_cc +1
where    
    order_id=#order_id#    
    and features_cc =#ori_ features_cc#

Cabe señalar aquí que el propietario debe revisar cuidadosamente el SQL de su tabla relacionada, lo que requiere que todos los cambios relacionados con el campo de características de esta tabla se agreguen con features_cc = features_cc +1 para el cálculo, de lo contrario, provocará conflictos de concurrencia y generalmente estará protegido Medidas, de lo contrario ganó la oferta .

En el entorno real, existen muchos escenarios de alta concurrencia. Pensemos si hemos agregado conscientemente una protección de bloqueo optimista al campo de características.

Sin embargo, debe mencionarse que el cultivo intensivo y el control de este campo tienen el costo de aumentar los costos de mantenimiento.

Tomó mucho tiempo para los dos campos de características y atributos antes de que los estudiantes de BU llegaran a un consenso y revisen el código, requiriendo _cc para el control de versiones.

Si los cambios son demasiado frecuentes, puede proponer mantenerlos por separado para separar los datos calientes y fríos.

Resumen optimista y bloqueo pesimista: resumen pequeño

  Cerradura pesimista Bloqueo optimista
El concepto El bloqueo de registros directamente durante la consulta hace que sea imposible consultar y actualizar otras transacciones Verifique la versión o la marca de tiempo cuando envíe la actualización
Gramática seleccione ... para actualizar Utilice la versión o la marca de tiempo para comparar
Implementador La base de datos en sí Desarrollador
Escena aplicable Gran cantidad de concurrencia. Baja concurrencia
Analogia Java Palabras clave sincronizadas Algoritmo CAS

Bloqueo compartido y bloqueo exclusivo y bloqueo de intención y bloqueo de autorización

Se pueden ver las características de la transacción: https://blog.csdn.net/xushiyu1996818/article/details/103460349

Cerradura exclusiva y cerradura compartida

Cerraduras compartidas (cerraduras compartidas, cerraduras S)

Xiaoming dijo: cuando no tienes novia, cuando quieres enrollar sábanas con una mujer, solo puedes ir al barrio rojo.

El bloqueo compartido también se denomina bloqueo de lectura. Si la transacción T1 agrega el bloqueo S a la fila R, entonces

Otras transacciones T2 / T3 / Tn solo pueden agregar un bloqueo S a la fila R, no otros bloqueos

La transacción que obtiene el bloqueo S solo puede leer datos, no escribir datos (usted es estúpido, por supuesto, no puede eliminarlo).

seleccione ... bloquear en modo compartido;

Cerraduras exclusivas (cerraduras X)

Xiaoming dijo: Si tienes dinero para encontrar un boleto femenino, debes monopolizar el boleto femenino, ya que otras personas no pueden usarlo. ¡Esto es exclusivo! Centrémonos en cerraduras exclusivas.

Un bloqueo exclusivo también se denomina bloqueo de escritura. Si la transacción T1 agrega un bloqueo X a la fila R, entonces

Ninguna otra transacción T2 / T3 / Tn puede agregar ningún tipo de bloqueo a la fila R hasta que se libere el bloqueo X en la fila R de la transacción T1.

La transacción que obtiene el bloqueo X puede leer datos y escribir datos (también puede eliminar datos).

seleccione ... para actualizar

Nota: esta gramática también es un bloqueo pesimista

Ejemplo de tabla USUARIO:

carné de identidad nombre desc
1 Ma Yun Hombre mas rico
2 Komei Primero negativo

 

// start T1
SELECT * FROM USER WHERE id = 1 lock in share mode; (S锁)
......

// start T2
UPDATE USER SET name = '小明' WHERE id = 1;
......

Si T1 no se compromete, el bloqueo S no se liberará,
entonces T2 mirará fijamente el bloqueo X y esperará a que T1 (transacción 1) libere el bloqueo S.

En este momento

// 接上文代码块
// start T3
// 此时,如果 T3 做同样查询,可以直接获取S锁进行查询
SELECT * FROM USER WHERE id = 1 lock in share mode; (S锁)

这个时候如果T1(事务1)要进行 DELETE 操作

// start T1
SELECT * FROM USER WHERE id = 1 lock in share mode; (S锁)
......
DELETE FROM USER WHERE id = 1;
......

En este momento:
T1 descubre que el bloqueo X está ocupado por T2, por lo que T1 no puede esperar al bloqueo X y espera a que T2 libere el bloqueo X, y T2 mantiene el bloqueo X y espera a que T1 libere el bloqueo S.
Después de que se produce un punto muerto, InnoDB generará un mensaje de error y liberará el bloqueo ( más adelante hablará sobre los puntos muertos y las soluciones que se encuentran en los negocios ).

El código de bloqueo X anterior se puede mostrar con el siguiente diagrama:

Use el flujo de tiempo para mostrar la interacción de los tres hilos de la siguiente manera:

Intención de bloqueo

Cerraduras de intención

Xiao Ming dijo: Cuando está buscando un maestro Cang o un boleto femenino, primero debe verificar si la otra parte es compartida o monopolizada por otros, en lugar de ir a alguien para encerrarla en el frente, ¡lo que puede ahorrar costos!

El bloqueo de intención es un bloqueo de tabla, que se utiliza principalmente en innoDB. Es el comportamiento de la base de datos en sí. No requiere intervención manual. Se lanzará una vez que finalice la transacción.

Los bloqueos intencionales se dividen en bloqueos compartidos intencionales (bloqueos IS) y bloqueos exclusivos intencionales (bloqueos IX)

  • Bloquear: indica que algunas filas se bloquearán en la transacción
  • IX bloqueo: indica que se agregarán X filas a algunas filas en la transacción

La función principal es mejorar el rendimiento del motor de almacenamiento de bloqueo con intención, INNODB en S y X bloquea un bloqueo de fila, cada vez que viene una transacción, necesidades del motor de almacenamiento para atravesar los bloqueos mantenidos por todas las líneas, el rendimiento más bajo , y por lo tanto la introducción de bloqueo con intención , Antes de verificar el bloqueo de fila, verifique si existe el bloqueo intencional; si existe, bloquee el hilo.

Uso de bloqueo intencional

Siguiendo las ideas anteriores, veamos la lógica utilizada

Dar una castaña

T1:
SELECT * FROM A WHERE id = 1 lock in share mode;(加S锁)

T2:
SELECT * FROM A WHERE id > 0 for update; (加X锁)

Al observar las dos transacciones SQL anteriores, cuando se ejecuta T1, se agrega un bloqueo S a la línea id = 1. Antes de ejecutar T2, es necesario obtener el bloqueo de actualización de toda la tabla para determinar, es decir:
paso1: determinar si la tabla A tiene un bloqueo a nivel de tabla
Paso 2: Determine si hay un bloqueo de nivel de fila para cada fila de la Tabla A.
Cuando la cantidad de datos es grande (generalmente una tabla de 5-50 millones de datos), este juicio del paso 2 es extremadamente ineficiente .

Lino cayó! Lino cayó! Lino cayó! Entonces, necesitamos cerrar el acuerdo.

Protocolo de bloqueo intencional

Para obtener el bloqueo S de algunas filas de la tabla A, la transacción debe adquirir el bloqueo IS de la tabla A

Para obtener el bloqueo X de algunas filas de la tabla A, la transacción debe adquirir el bloqueo IX de la tabla A

Ahora! Qué se obtiene me siento?
Esta vez el paso 2 cambiado para convertirse en un bloqueo con intención juez
Paso 2: Una tabla encontrado que hay una cerradura, lo que indica que la tabla debe tener a nivel de fila S cerradura, por lo tanto, T2 X aplicación de bloque de bloqueo de espera, no es necesario el fallo completo Table, juzgando que la eficiencia ha mejorado mucho (¿ahorra mucho dinero?)

Bloqueo de separación

Un bloqueo de espacio es un bloqueo en un espacio entre registros de índice, o un bloqueo en el espacio antes del primero o después del último registro de índice. Por ejemplo, SELECCIONE c1 DESDE t DONDE c1 ENTRE 10 y 20 PARA ACTUALIZAR; evita que otras transacciones inserten un valor de 15 en la columna t.c1, independientemente de si ya existía dicho valor en la columna, porque los espacios entre todos los valores existentes en el rango están bloqueados.

Cuando usamos condiciones condicionales de rango para recuperar datos (índice no agrupado, índice no único) y solicitar bloqueos compartidos o exclusivos, InnoDB bloqueará los elementos de índice de los registros de datos que cumplan las condiciones; Los registros que no existen se denominan huecos, e InnoDB también bloqueará estos huecos, es decir, bloqueos de huecos.
Los bloqueos Next-Key son bloqueos de fila elegibles más bloqueos de espacio

Condiciones para el bloqueo de espacio

Bajo InnoDB, el bloqueo de espacio debe cumplir tres condiciones:

  • El nivel de aislamiento es RR
  • Lectura actual
  • La condición de consulta puede ir al índice

El papel de la brecha

Documentación oficial de MySQL: el propósito del bloqueo de brecha es evitar que otras transacciones agreguen datos a la brecha.

En InnoDB en modo RR, el bloqueo de espacio puede jugar dos roles:

1. Garantizar la recuperación y replicación de datos.

2. Prevenir la lectura fantasma

  • Evitar la ejecución de declaraciones de inserción en huecos
  • Evitar que los datos existentes se actualicen en la brecha

La recuperación y replicación de datos de la base de datos se logra a través de binlog, que registra las declaraciones DML ejecutadas con éxito (muy utilizadas en Alibaba) . En la recuperación de datos, es necesario garantizar la secuencia de transacciones entre los datos y evitar los bloqueos de espacio. Inserte otras transacciones en un lote de datos.

524 artículos originales publicados · Me gusta 80 · Visitas 150,000+

Supongo que te gusta

Origin blog.csdn.net/xushiyu1996818/article/details/105558662
Recomendado
Clasificación