MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Este artículo Fuente: GitHub · Haga clic aquí || GitEE · Haga clic aquí

En primer lugar, el concepto Introducción a la cerradura

1, descripción básica

función principal mecanismo de bloqueo se utiliza para coordinar el acceso simultáneo a los mismos recursos, tomando el tema de los recursos a través de múltiples sesiones de multithreading. mecanismo de bloqueo es un muy grandes módulos, implementar MySQL dificultad de varios módulos básicos: la indexación, el mecanismo de bloqueo, la transacción. He aquí una demostración MySQL5.6 basada en varios escenarios típicos, esta vez a través de las MySQL pocos problemas, procesar algunos analistas y la idea es más crucial. conceptos comunes en las cerraduras de MySQL: bloqueos compartidos a leer, escribir, cerraduras exclusivos bloqueos de tabla, bloqueos de registro, la brecha de bloqueo.

2, el motor de almacenamiento y de bloqueo

  • motor MyISAM: ambos modos de lectura y escritura, bloqueo de tabla de soporte;
  • motor InnoDB: bloqueos de escritura apoyos a nivel de fila, hueco interbancaria de bloqueo, bloqueo de tabla InnoDB soporta;

3, la API de operación de bloqueo

  • LOCK nombre TABLE [READ, WRITE]; 加 表 锁
  • TABLAS abre; liberación por la norma

Dos, el mecanismo de bloqueo MyISAM

1, descripción básica

MySQL a nivel de tabla de bloqueo tiene dos modos: compartidas bloqueos de lectura (Read-LOCK) y bloqueos de escritura exclusivos (Write-Lock). Para la tabla MyISAM operaciones de lectura, otros hilos no bloquearán las solicitudes de lectura de la misma mesa, pero el bloqueo de peticiones de escritura en la misma mesa, para las tablas MyISAM operación de escritura y pueden bloquear otros hilos para leer y escribir la misma operación mesa; el motor MyISAM entre las operaciones de lectura y escritura, y entre las operaciones de escritura y la escritura son serializados. Después de un hilo de conversación adquiere un bloqueo de escritura en una tabla, sólo la corriente hilo de conversación que tiene el bloqueo puede operar sobre la mesa. Otros temas de lectura y las operaciones de escritura van a esperar hasta que se libere el bloqueo.

2, verificar Caso

mecanismo de bloqueo de la tabla en base a las características de la anterior, los siguientes dos casos, la verificación.

  • La estructura de la tabla
CREATE TABLE `dc_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `tell_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户表';
CREATE TABLE `dc_user_info` (
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `city` varchar(20) DEFAULT NULL COMMENT '城市',
  `country` varchar(20) DEFAULT NULL COMMENT '国家',
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  • bloqueos de lectura compartidas

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Una ventana de conversación

-- 1、加读锁
LOCK TABLE dc_user READ ;
-- 2、当前会话查询,OK
SELECT * FROM dc_user ;
-- 4、当前会话写入,Error
INSERT INTO dc_user (user_name,tell_phone) VALUES ('lock01','13267788998');
-- 6、查询其他表,Error
SELECT * FROM dc_user_info ;
-- 7、释放锁
UNLOCK TABLES ;

Sesión ventana de dos

-- 3、其他会话查询,OK
SELECT * FROM dc_user ;
-- 5、其他会话写入,Error
INSERT INTO dc_user (user_name,tell_phone) VALUES ('lock01','13267788998');
-- 8、再次执行写入读取,OK
INSERT INTO dc_user (user_name,tell_phone) VALUES ('lock01','13267788998');
SELECT * FROM dc_user ;

Aquí verificación mecanismo de mesa compartida leer las cerraduras.

  • bloqueos de escritura exclusivos

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Aquí verificación mecanismo de bloqueo de tabla de escritura exclusivo.

  • la contención de bloqueo consultas

Ver configurado de la siguiente declaración,

show status like 'table%';

Table_locks_waited mayor sea el valor, la contención de bloqueo más grave, más la eficiencia es baja.

3, emitir escrituras concurrentes

Para bloqueos de escritura exclusiva caso de prueba de nuevo Descripción: Bajo ciertas condiciones, consultas de tabla MyISAM y también es compatible con la inserción de ejecución concurrente. Valores [0,1,2] mediante la configuración del sistema de las variables concurrent_insert, pueden lograrse escrituras concurrentes.

  • concurrent_insert = 0, prohíbe escrituras concurrentes;
  • concurrent_insert = 1, la configuración por defecto AUTO, no hay mesas huecos MyISAM, es decir, la mesa intermedia se eliminan no hay filas, por ejemplo, [2,3], después de quitar 2 [1, 3], al mismo tiempo, permite la lectura del medidor , otro hilo escribe el registro de final de la mesa.
  • concurrent_insert = 2, si no hay ninguna tabla MyISAM vacío, permitir inserciones concurrentes en el registro de remolque.
    En el siguiente ejemplo, SESSION_1 obtener una tabla de bloqueo LEER LOCAL, el hilo puede consultar las operaciones sobre la mesa, pero no en las operaciones de actualización de mesa; otros hilos (session_2), aunque no está sobre la mesa eliminar y operaciones de actualización, pero puede ser operación de inserción concurrente en contra de la tabla, la tabla se asume aquí que la cavidad intermedia no existe.

4, los temas prioritarios

motor de almacenamiento MyISAM a leer y bloqueos de escritura son mutuamente excluyentes, es una serie de operaciones de lectura y escritura. Sin embargo, cuando una lectura simultánea y peticiones de operación de escritura, la prioridad se otorga a la cerradura de escritura de datos, este mecanismo puede ser configurado para modificar, los parámetros de configuración especificados de baja prioridad-actualizaciones, dado que el motor MyISAM defecto como prioridad reivindicada a solicitudes de lectura.
Mediante la ejecución del comando SET

  • LOW_PRIORITY_UPDATES = 1, por lo que la operación de escritura de la sesión de prioridad más baja.
  • Especificar los INSERT, UPDATE, DELETE atributos LOW_PRIORITY, lo que reduce la prioridad de la declaración.

5, la solicitud de fijación de la mesa

comprobación de la coherencia de datos problemas, tales como la cantidad total de las mercancías vendidas = + excedente de inventario, cuando deberíamos comprobar en una sola sesión, mientras bloqueado tabla Pedidos y la tabla de inventario, por lo que con el fin de leer la tabla cuando la tabla se modifica de , lo que resulta en un error de datos.

Tres, mecanismo de bloqueo InnoDB

1, los asuntos básicos conceptuales

  • concepto de transacción

Una transacción es una serie de operaciones como una sola unidad lógica de trabajo realizado (sentencias SQL). Estas operaciones tienen éxito, ya sea todo o todos sin éxito.

  • propiedades ACID de una transacción

La atomicidad (atomicidad) : una pluralidad de operaciones en una transacción ya sea éxito o fracasan

La consistencia (Consistencia) : la integridad de los datos antes y después de la ejecución de la transacción es consistente

Aislamiento (aislamiento) : en el proceso de ejecución de la transacción, no debe estar sujeta a interferencias de otras transacciones

Persistente (Durabilidad Rev) : Una vez que el final de la transacción, los datos de persistencia de la base de datos

  • asuntos de política

Sucia leer : Una transacción lee otra transacción no presentó los datos

lectura no repetible : antes y después de una transacción lee los mismos datos varias veces, contenido de datos inconsistentes, actualización de escenarios de emisión

Maniquí leer (magia de lectura) : leer muchas veces antes y después de una transacción, la cantidad de inconsistencia de datos, insertar problema escena

  • Niveles de aislamiento

UNCOMMITTED los Leer : Los datos de transacciones puede ser leído otra transacciones no confirmadas.

Leer el cometido : Transacción tiene que esperar a otra, comete transacción para leer los datos, resolver lectura sucia.

La lectura repetible : la lectura de datos en la salida, transacción abierta, modificar ya no está permitido el funcionamiento, la solución: las lecturas sucias, lecturas no repetibles.

Serializable : el más alto nivel de aislamiento, el orden de serialización de transacción de ejecución, para resolver las lecturas sucias, lectura no repetible, lectura fantasma. rendimiento de la base de datos de consumo Sin embargo ineficiente.

2, el mecanismo de bloqueo descrito

La mayor diferencia InnoDB y MyISAM son dos puntos: en primer lugar, para apoyar la realización de la operación, y en segundo lugar, mediante un bloqueo de filas. Los bloqueos de fila de nivel de bloqueo y a nivel de tabla tienen muchas diferencias, además, la introducción de los asuntos también ha traído nuevos problemas: la concurrencia, punto muerto.

  • bloqueo compartido: también conocido como un bloqueo de lectura. Permite una operación para leer una fila para evitar que otras transacciones para obtener el mismo conjunto de datos bloqueo exclusivo. Si los datos de la transacción T objetos Una ventaja bloqueo compartido, la transacción T se puede leer pero no modificó A A, y luego los únicos otros asuntos compartido cerraduras, y no se puede escribir sin salida al mar cerraduras hasta que se suelte T compartida en A. Esto asegura que otras transacciones pueden ser una lectura, pero no realiza ningún cambio antes del cierre de liberación A S T en A.

  • bloqueo exclusivo: también conocido como bloqueo de escritura. Permiten obtener un bloqueo exclusivo de datos de transacciones de actualización, evitando otras operaciones para lograr los mismos recursos compartidos cerraduras y bloqueos exclusivos leídos. Si la transacción objeto de datos de A a T más un bloqueo de escritura, se puede leer una transacción T también puede modificar A, otras transacciones no se pueden agregar a cualquier cerradura A hasta que el pestillo de seguridad de escritura en T A.

3. Verificar caso

  • La estructura de la tabla
CREATE TABLE `dc_user_in01` (
  `id` int(11) DEFAULT NULL COMMENT 'id',
  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `tell_phone` varchar(20) DEFAULT NULL COMMENT '手机号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

CREATE TABLE `dc_user_in02` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `tell_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='用户表';

注意结构: Tabla dc_user_in01 ningún índice de clave principal. Tabla dc_user_in02 tiene un índice de clave principal, pero utiliza el motor de almacenamiento InnoDB, verificar el siguiente caso será diferente.

  • No había ninguna mesa estructura de índice

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Una ventana de conversación

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=1,OK
SELECT * FROM dc_user_in01 WHERE id=1 ;
-- 3、添加写锁失败
SELECT * FROM dc_user_in01 
WHERE id=1 FOR UPDATE ;
-- 4、恢复事务提交
SET AUTOCOMMIT = 1 ;

Sesión ventana de dos

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=2,OK
SELECT * FROM dc_user_in01 WHERE id=2 ;
-- 3、写入失败(等待)
INSERT INTO dc_user_in01 (id,user_name,tell_phone) 
VALUES (3,'lock01','13267788998');
-- 4、写锁失败(等待)
SELECT * FROM dc_user_in01 
WHERE id=2 FOR UPDATE ;
-- 5、恢复事务提交
SET AUTOCOMMIT=1 ;
  • estructura de índice de la tabla

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Una ventana de conversación

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=1,OK
SELECT * FROM dc_user_in02 WHERE id=1 ;
-- 3、添加写锁成功
SELECT * FROM dc_user_in02 WHERE id=1 FOR UPDATE ;
-- 执行到这里,再执行窗口2
-- 4、恢复事务提交
SET AUTOCOMMIT = 1 ;

Sesión ventana de dos

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=2,OK
SELECT * FROM dc_user_in02 WHERE id=2 ;
-- 3、查询id=1,OK,加读锁
SELECT * FROM dc_user_in02 WHERE id=1 ;
-- 4、写入成功
INSERT INTO dc_user_in02 (user_name,tell_phone) VALUES ('lock01','13267788998');
-- 5、加写锁成功,id为2的
SELECT * FROM dc_user_in02 
WHERE id=2 FOR UPDATE ;
-- 6、加写锁失败(等待),占用id为1的
SELECT * FROM dc_user_in02 WHERE id=1 FOR UPDATE ;
-- 7、恢复事务提交
SET AUTOCOMMIT=1 ;
  • Índice de fallos

Aquí hay que prestar atención a si el uso del índice, en muchas consultas, el índice puede ser debido a diversas razones no se ejecuta.

explain SELECT * FROM dc_user_in02 WHERE id=1 ;
  • la contención de bloqueo consultas
show status like 'innodb_row_lock%';

Cuanto mayores sean los valores Innodb_row_lock_waits y Innodb_row_lock_time_avg, la contención de bloqueo más grave, más la eficiencia es baja.

4, de próxima clave 锁

  • La documentación oficial

Con el fin de evitar que las lecturas fantasma, InnoDB utiliza un algoritmo llamado la próxima clave bloqueada, y la brecha registrará bloqueo juntos es decir, de bloqueo: InnoDB bloqueos a nivel de fila en la puesta en práctica, lo hará de esta manera - registro de índice de exploración, harán los registros que cumplen los criterios de índice compartida bloqueos o bloqueos exclusivos.

[Next-Key]=[Record-lock]+[Gap-lock]

Si lo anterior varias mecanismo de bloqueo da la impresión de que deje una, que el algoritmo de próxima clave será sospechoso de la vida.

  • Caso verificar

Aquí confirmar principalmente la presencia de la brecha mecanismo de Gap-bloqueo de la cerradura.

CREATE TABLE `dc_gap` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `id_index` int(11) NOT NULL COMMENT 'index',
  PRIMARY KEY (`id`),
  KEY `id_index` (`id_index`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='间隙表';
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('1', '2');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('3', '4');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('6', '7');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('8', '7');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('9', '9');

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Una ventana de conversación

-- 1、开始事务
START TRANSACTION ;
-- 3、锁定id_index=7的两条记录
SELECT * FROM dc_gap 
WHERE id_index=7 FOR UPDATE ;
-- 9、提交
COMMIT ;

Sesión ventana de dos

-- 2、开始事务
START TRANSACTION ;
-- 4、写入等待,id_index=6
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('4', '6');
-- 5、写入等待,id_index=4
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('4', '4');
-- 6、写入成功,id_index=3
INSERT INTO `dc_gap` (`id`, `id_index`) 
VALUES ('4', '3');
-- 7、写入等待,id_index=9
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('7', '9');
-- 8、写入成功,id_index=10
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('7', '10');

4 hasta el hueco 7, 7 hacia abajo en el hueco 9, el bloqueo brecha [4,9], y contiene valores inclusive.

5, Dead-Lock 锁

  • Descripción básica

Dos o más operaciones sobre los mismos recursos de cada ocupación, y el resto de las solicitudes de bloqueo de recursos ocupados, dando lugar a un fenómeno bucle infinito, que es un callejón sin salida.

  • Caso verificar

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Una ventana de conversación

-- 1、开启事务
START TRANSACTION ;
-- 3、占用id=6的资源
SELECT * FROM dc_gap WHERE id=6 FOR UPDATE ;
-- 5、占用id=9的资源等待
SELECT * FROM dc_gap WHERE id=9 FOR UPDATE ;

Sesión ventana de dos

-- 2、开启事务
START TRANSACTION ;
-- 4、占用id=9的资源
SELECT * FROM dc_gap WHERE id=9 FOR UPDATE ;
-- 6、占用id=6的资源抛死锁
SELECT * FROM dc_gap WHERE id=6 FOR UPDATE ;

补刀一句: Lograr una variedad de mecanismo de detección de punto muerto base de datos, o esperar a que el tiempo de espera de interbloqueo final, se detecta motor de almacenamiento InnoDB después de un punto muerto, se devuelve un error de inmediato, de lo contrario la operación cambiará en dos la parte superior, mirando, un millón de años.

注意: Punto muerto en el negocio transaccional, no se puede evitar del todo, un menor número de recursos de bloqueo, el tamaño de partícula fina, tratan de evitar esta situación.

En cuarto lugar, la dirección de origen

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

MySQL Fundamentos (06): la gestión de transacciones, caja de mecanismo de bloqueo detallada

Supongo que te gusta

Origin blog.51cto.com/14439672/2479882
Recomendado
Clasificación