Mecanismo de bloqueo

13. Mecanismo de bloqueo

Resolver la simultaneidad causada por el uso compartido de recursosproblema

13.1 Bloqueo pesimista

Asume siempre el peor de los casos. Cada vez que obtienes los datos, crees que otros los modificarán, por lo que cada vez que obtengas los datos, los bloquearás, de modo que otros que quieran obtener los datos los bloquearán hasta que consigan el bloqueo. ( recurso compartido Solo lo usa un subproceso a la vez, otros subprocesos se bloquean y los recursos se transfieren a otros subprocesos después de que se agotan ). Muchos de estos mecanismos de bloqueo se utilizan en bases de datos relacionales tradicionales, como bloqueos de filas, bloqueos de tablas, etc., bloqueos de lectura, bloqueos de escritura, etc., que están todos bloqueados antes de las operaciones.

13.2 Bloqueo optimista

Asumir siempre la mejor situación. Cada vez que obtengo los datos, creo que otros no los modificarán, por lo que no se bloqueará, pero al actualizar se juzgará si otros han actualizado los datos durante este período . Puede usar la versión, el mecanismo numérico y la implementación del algoritmo CAS. El bloqueo optimista es adecuado para aplicaciones que leen más y escriben menos, lo que puede mejorar el rendimiento .

13.2.1. Desventajas del bloqueo optimista

Problema de ABA

Si una variable V es el valor de A cuando se lee por primera vez, y se comprueba que sigue siendo el valor de A cuando está lista para ser asignada, ¿podemos mostrar que su valor no ha sido modificado por otros subprocesos? Obviamente no es posible, porque durante este tiempo su valor puede cambiarse a otro valor, y luego cambiarse de nuevo a A, entonces la operación CAS creerá erróneamente que nunca se ha modificado. Este problema se denomina problema "ABA" del funcionamiento de CAS .

Spin CAS (es decir, si no tiene éxito, continuará ejecutándose en un bucle hasta que tenga éxito). Si no tiene éxito durante mucho tiempo, traerá un costo de ejecución muy grande para la CPU.

13.2.2, la realización de un bloqueo optimista

Mecanismo de número de versión

Generalmente, se agrega un campo de versión de número de versión de datos a la tabla de datos, que indica el número de veces que se han modificado los datos. Cuando se modifican los datos, el valor de la versión aumentará en uno. Cuando el hilo A quiere actualizar el valor de los datos, también leerá el valor de la versión mientras lee los datos. Al enviar la actualización, si el valor de la versión recién leído es igual al valor de la versión en la base de datos actual, se actualizará, de lo contrario intente nuevamente la operación de actualización hasta que la actualización sea exitosa. La versión enviada debe ser mayor que la versión actual del registro para ejecutar la "estrategia de bloqueo optimista" actualizada.

Algoritmo CAS

A saber, comparar e intercambiar (comparar e intercambiar) , es un algoritmo sin bloqueo bien conocido . Programación sin bloqueo, es decir, lograr la sincronización variable entre múltiples subprocesos sin utilizar bloqueos, es decir, lograr la sincronización variable sin que se bloqueen los subprocesos, por lo que también se denomina sincronización sin bloqueo (Sincronización sin bloqueo). El algoritmo CAS involucra tres operandos

  • Necesita leer y escribir el valor de memoria V
  • Valor a comparar A
  • Nuevo valor por escribir B

Si y solo si el valor de V es igual a A, CAS actualiza atómicamente el valor de V con el nuevo valor B, de lo contrario no realizará ninguna operación (la comparación y reemplazo es una operación atómica). En circunstancias normales, es una operación de giro , es decir, un reintento constante .

CAS solo es válido para una única variable compartida, CAS no es válido cuando la operación involucra múltiples variables compartidas

Clasificación de cerraduras

Tipo de operación:

  • Bloqueo de lectura (bloqueo compartido): para los mismos datos, se pueden realizar varias operaciones de lectura al mismo tiempo, pero no se pueden realizar operaciones de escritura
  • Bloqueo de escritura (bloqueo de exclusión mutua): si la operación de escritura actual no se completa, no se pueden realizar otras operaciones (operación de lectura, operación de escritura)

Rango de operación:

  • Bloqueo de tabla: bloquea una tabla como un todo a la vez , como MyISAM ,
    • Ventajas: bajo techo , bloqueo rápido
    • Desventajas: el alcance del bloqueo es grande y es probable que se produzcan conflictos.
  • Bloqueo de fila: bloquea una fila de datos a la vez
  • Bloqueo de página

Operación de bloqueo

--加锁
lock table  mytable read/write; 

--查看加锁的表
show open tables;

--会话:session: 每一个访问数据的dos命令行、数据库客户端工具


----------【加读锁】
--会话0
--对A表加了【读锁】,那么会话0可以对A表进行读,但是不可以写
--会话0不可以对其他表进行		读和写

--其他会话
---可以对A表进行读操作,
---写操作会等待A表的读锁释放




----------【加写锁】

--会话0给表A加写锁,那么会话0可以对A表进行【任何操作】,但是【不能】对其他表操作

--其他会话:
 ---可以对会话0加锁的表进行增删改查,但是要等会话0释放锁

Verifique las tablas que se han bloqueado: mostrar tablas abiertas; 1 representa el bloqueo

Analice la gravedad del bloqueo de la tabla: estado del host como 'tabla%';

Table_locks_immediate: el número de bloqueos que se pueden adquirir

Table_locks_waited: indica el número de bloqueos a esperar

Las cerraduras de las mesas se desbloquean mediante las mesas de desbloqueo

El bloqueo de fila se desbloquea mediante transacción, compromiso de reversión

Nota sobre bloqueos de fila

-Si no hay [índice], el bloqueo de fila se convertirá en [bloqueo de tabla]

Se produce una conversión de tipo de la clase de índice, luego el índice deja de ser válido. Por lo tanto, el bloqueo se ha convertido, entonces la ejecución fallará.

Análisis de bloqueo de filas

mostrar el estado como '% innodb_row_lock%';

---- Innodb_row_lock_current_waits: el número de cerraduras en espera actualmente
| Innodb_row_lock_time: el tiempo total de espera. Tiempo total de espera desde el inicio del sistema hasta ahora
| Innodb_row_lock_time_avg: El mercado de espera promedio. Tiempo medio de espera desde el inicio del sistema hasta la actualidad
| Innodb_row_lock_time_max Tiempo máximo de espera. El tiempo máximo de espera desde el inicio del sistema hasta el presente.

| Innodb_row_lock_waits: número de esperas

Supongo que te gusta

Origin blog.csdn.net/qq_40738693/article/details/113929521
Recomendado
Clasificación