Relación MySQL avanzada-maestro-esclavo de Lock + mysql (explicación detallada 02)

Tabla de contenido

1. bloquear

1.1 Problema de bloqueo de MySQL

1.1.1 Descripción general de bloqueos

1.1.2 Clasificación de cerraduras

1.1.3 Bloqueo de MySQL

1.2.Bloqueo de tabla MyISAM

1.2.1 Cómo agregar bloqueo de tabla

1.2.2 Leer caja de cerradura

1.2.3 Escribir caja de bloqueo

1.3 Los bloqueos de filas de InnoDB admiten transacciones

1.3.1 Introducción a los bloqueos de fila

1.3.2 Conocimientos previos

1.3.3 Modo de bloqueo de filas de InnoDB

1.3.4 Preparación de casos innodb admite bloqueos transaccionales a nivel de fila

1.3.5 Demostración básica de bloqueo de filas ---- Transacción de soporte

1.4 Bloqueo pesimista y bloqueo optimista


1. bloquear

1.1 Problema de bloqueo de MySQL

1.1.1 Descripción general de bloqueos

Un bloqueo es un mecanismo mediante el cual una computadora coordina el acceso simultáneo a un recurso compartido por parte de múltiples procesos o subprocesos (para evitar contiendas).

En una base de datos, los datos también son un recurso compartido por muchos usuarios. Cómo garantizar la coherencia y validez del acceso concurrente a los datos es un problema que todas las bases de datos deben resolver, y los conflictos de bloqueo también son un factor importante que afecta el rendimiento del acceso concurrente a las bases de datos. Desde esta perspectiva, los bloqueos son particularmente importantes y más complejos para las bases de datos.

1.1.2 Clasificación de cerraduras

Desde la granularidad de las operaciones de datos:

1) Bloqueo de la mesa: durante la operación, toda la mesa estará bloqueada. Soporte de InnoDB después de MyISAM 5.6

2) Bloqueo de fila: durante la operación, la fila de operación actual se bloqueará. InnoDB

Del tipo de operación de datos:

1) Bloqueo de lectura (bloqueo compartido): para el mismo dato, se pueden realizar múltiples operaciones de lectura simultáneamente sin afectarse entre sí.

2) Bloqueo de escritura (bloqueo exclusivo): antes de que se complete la operación actual, bloqueará otras operaciones de escritura y lectura.

1.1.3 Bloqueo de MySQL

En comparación con otras bases de datos, el mecanismo de bloqueo de MySQL es relativamente simple y su característica más notable es que diferentes motores de almacenamiento admiten diferentes mecanismos de bloqueo. La siguiente tabla enumera la compatibilidad de cada motor de almacenamiento para cerraduras:

motor de almacenamiento cerradura de mesa bloqueo de nivel de fila
MiISAM apoyo no apoyo
InnoDB Soporte 5.6 apoyo

Las características de estos dos bloqueos MySQL se pueden resumir aproximadamente de la siguiente manera:

Tipo de bloqueo características
cerradura de mesa Prefiera el motor de almacenamiento MyISAM, con baja sobrecarga y bloqueo rápido; sin interbloqueos; gran granularidad de bloqueo, la mayor probabilidad de conflictos de bloqueo y la menor concurrencia.
bloqueo de nivel de fila Prefiera el motor de almacenamiento InnoDB, que tiene una gran sobrecarga y un bloqueo lento; habrá interbloqueos; la granularidad de bloqueo es la más pequeña, la probabilidad de conflictos de bloqueo es la más baja y la concurrencia también es la más alta.

De las características anteriores se puede ver que es difícil decir qué cerradura es mejor en general, ¡pero qué cerradura es más adecuada para características de aplicación específicas! Solo desde la perspectiva de los bloqueos: los bloqueos a nivel de tabla son más adecuados para aplicaciones basadas en consultas con solo una pequeña cantidad de datos actualizados de acuerdo con las condiciones del índice, como las aplicaciones web; los bloqueos a nivel de fila son más adecuados para una gran cantidad de concurrentes actualizaciones basadas en condiciones de índice y una pequeña cantidad de datos diferentes, y aplicaciones de consulta simultáneas, como algunos sistemas de procesamiento de transacciones en línea (OLTP).

1.2.Bloqueo de tabla MyISAM

El motor de almacenamiento MyISAM solo admite bloqueos de tabla , que es el único tipo de bloqueo admitido en las primeras versiones de MySQL.

1.2.1 Cómo agregar bloqueo de tabla

Antes de ejecutar una declaración de consulta (SELECT), MyISAM agregará automáticamente un bloqueo de lectura a todas las tablas involucradas , y antes de ejecutar una operación de actualización (ACTUALIZAR, ELIMINAR, INSERTAR, etc.), agregará automáticamente un bloqueo de escritura a las tablas involucradas. Este proceso no requiere la intervención del usuario, por lo tanto, los usuarios generalmente no necesitan bloquear explícitamente las tablas MyISAM directamente con el comando LOCK TABLE. Pero lo bloqueamos artificialmente para demostrarle el efecto.

Mostrar sintaxis de bloqueo de tabla:

加读锁 : lock table table_name read;

加写锁 : lock table table_name write;

释放锁:   unlock tables;

1.2.2 Leer caja de cerradura

Preparar el ambiente:

create database demo_03 default charset=utf8mb4;

use demo_03;

CREATE TABLE `tb_book` (
  `id` INT(11) auto_increment,
  `name` VARCHAR(50) DEFAULT NULL,
  `publish_time` DATE DEFAULT NULL,
  `status` CHAR(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=myisam DEFAULT CHARSET=utf8 ;

INSERT INTO tb_book (id, name, publish_time, status) VALUES(NULL,'java编程思想','2088-08-01','1');
INSERT INTO tb_book (id, name, publish_time, status) VALUES(NULL,'solr编程思想','2088-08-08','0');



CREATE TABLE `tb_user` (
  `id` INT(11) auto_increment,
  `name` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=myisam DEFAULT CHARSET=utf8 ;

INSERT INTO tb_user (id, name) VALUES(NULL,'令狐冲');
INSERT INTO tb_user (id, name) VALUES(NULL,'田伯光');

Cliente uno:

1) Obtener el bloqueo de lectura de la tabla tb_book

lock table tb_book read;

2) Ejecutar la operación de consulta.

select * from tb_book;

Se puede ejecutar normalmente y se pueden consultar los datos.  

Cliente dos:

3) Ejecutar la operación de consulta.

select * from tb_book;

Cliente uno:

4) Consultar tablas desbloqueadas

select name from tb_user;

Debido a que el usuario actual ya ha bloqueado otras tablas, solo después de desbloquearlas se pueden leer otras tablas.

unlock tables;
Cliente dos: 
5) Consultar tablas desbloqueadas
select name from tb_user;

Las tablas desbloqueadas se pueden consultar normalmente;

Cliente uno:

6) Realice la operación de inserción.

insert into tb_book values(null,'Mysql高级','2088-01-01','1');

Ejecute la inserción e informe un error directamente, debido a que el tb_book actual obtiene un bloqueo de lectura, no se puede realizar la operación de actualización.

Cliente dos:

7) Realizar la operación de inserción.

insert into tb_book values(null,'Mysql高级','2088-01-01','1');

 

Después de que se libera el comando de bloqueo de tablas de desbloqueo en el cliente 1, la instrucción inesrt en el cliente 2 se ejecuta inmediatamente;

Bloqueo de lectura: no afecta las operaciones de lectura de otros clientes, pero bloqueará las operaciones de escritura de otros clientes.


1.2.3 Escribir caja de bloqueo

Bloqueo de escritura (bloqueo exclusivo): no permita que otras sesiones realicen operaciones arbitrarias

Cliente uno:

1) Obtener el bloqueo de escritura de la tabla tb_book

lock table tb_book write ;

2) Ejecutar la operación de consulta.

select * from tb_book ;
 
  

La operación de consulta se ejecuta con éxito;

3) Realizar una operación de actualización

update tb_book set name = 'java编程思想(第二版)' where id = 1;

La operación de actualización se ejecuta con éxito;

Cliente dos:

4) Ejecutar la operación de consulta.

select * from tb_book ;

 

Después de que se libera el comando de bloqueo de tablas de desbloqueo en el cliente 1, la instrucción de selección en el cliente 2 se ejecuta inmediatamente;

Bloqueo de escritura: Bloquea cualquier operación de otros usuarios.

Resumir

1.3 Los bloqueos de filas de InnoDB admiten transacciones

1.3.1 Introducción a los bloqueos de fila

Características de bloqueo de fila: sesgado hacia el motor de almacenamiento InnoDB, con alta sobrecarga y bloqueo lento; pueden ocurrir interbloqueos; la granularidad de bloqueo es la más pequeña, la probabilidad de conflictos de bloqueo es la más baja y el grado de concurrencia también es el más alto.

Hay dos diferencias más importantes entre InnoDB y MyISAM: una es admitir transacciones; la otra es usar bloqueos a nivel de fila.

1.3.2 Conocimientos previos

¿Que asunto?
       Una transacción es una secuencia coherente de operaciones en una aplicación, todas las cuales deben completarse exitosamente; de ​​lo contrario, todos los cambios realizados durante cada operación se deshacen. Es decir, las transacciones son atómicas y una serie de operaciones en una transacción tienen éxito o no se realiza ninguna.

Transacciones y sus propiedades ACID

Una transacción es una unidad de procesamiento lógico compuesta por un conjunto de declaraciones SQL.

Las transacciones tienen las siguientes cuatro características, denominadas propiedades ACID de transacción.

Propiedades ácidas significado
Atomicidad Una transacción es una unidad de operación atómica y su modificación de los datos tiene éxito o fracasa.
Coherente Los datos deben estar en un estado coherente tanto al inicio como al final de una transacción.
Aislamiento El sistema de base de datos proporciona un cierto mecanismo de aislamiento para garantizar que las transacciones se ejecuten en un entorno "independiente" que no se vea afectado por operaciones concurrentes externas.
Durable Una vez completada la transacción, la modificación de los datos es permanente.

Problemas causados ​​por el procesamiento de transacciones concurrentes

pregunta significado
Actualización perdida Cuando dos o más transacciones seleccionan la misma fila, el valor modificado por la transacción inicial será sobrescrito por el valor modificado por la transacción posterior.
Lecturas sucias Cuando una transacción accede a los datos y los modifica, pero esta modificación no se ha enviado a la base de datos, en este momento, otra transacción también accede a los datos y luego los utiliza.
Lecturas no repetibles (lecturas no repetibles) Una transacción lee los datos leídos anteriormente en un momento determinado después de leer algunos datos, pero descubre que no son consistentes con los datos leídos anteriormente.
Lecturas fantasma Una transacción vuelve a leer los datos consultados previamente de acuerdo con las mismas condiciones de consulta, pero descubre que otras transacciones han insertado datos nuevos que cumplen con sus condiciones de consulta.

nivel de aislamiento de transacciones

Para resolver el problema de concurrencia de transacciones mencionado anteriormente, la base de datos proporciona un determinado mecanismo de aislamiento de transacciones para resolver este problema. Cuanto más estricto sea el aislamiento de transacciones de la base de datos, menores serán los efectos secundarios de la concurrencia, pero mayor será el precio pagado, porque el aislamiento de transacciones es esencialmente "serialización" de transacciones hasta cierto punto, lo que obviamente contradice la "concurrencia".

Hay 4 niveles de aislamiento de la base de datos, de menor a mayor, que son Lectura no confirmada, Lectura confirmada, Lectura repetible y Serializable. Estos cuatro niveles pueden resolver problemas como escritura sucia, lectura sucia, lectura no repetible y lectura fantasma. uno a uno.

nivel de aislamiento actualización perdida lectura sucia lectura no repetible lectura fantasma
Leer no comprometido ×
Leer comprometido × ×
Lectura repetible (predeterminado) × × ×
Serializable × × × ×

Observaciones: √ significa que puede aparecer, × significa que no aparecerá.

El nivel de aislamiento predeterminado de la base de datos Mysql es Lectura repetible, método de visualización:

show variables like 'tx_isolation';

1.3.3 Modo de bloqueo de filas de InnoDB

InnoDB implementa los siguientes dos tipos de bloqueos de fila.

  • Bloqueo compartido (S): también conocido como bloqueo de lectura, o bloqueo S para abreviar, un bloqueo compartido significa que varias transacciones pueden compartir un bloqueo para los mismos datos y todas pueden acceder a los datos, pero solo pueden leer y no pueden modificarse. .

    Cuando ejecuta select, innodb agregará un bloqueo compartido a la base de datos de forma predeterminada

  • Bloqueo exclusivo (X): también conocido como bloqueo de escritura, bloqueo X para abreviar, el bloqueo exclusivo no puede coexistir con otros bloqueos. Por ejemplo, si una transacción adquiere un bloqueo exclusivo en una fila de datos, otras transacciones ya no pueden adquirir otros bloqueos en la fila. fila, incluidos bloqueos compartidos y bloqueos exclusivos, pero las transacciones que adquieren bloqueos exclusivos pueden leer y modificar datos.

    Al realizar una operación de modificación, de forma predeterminada, InnoDB agregará un bloqueo exclusivo a la fila correspondiente en la tabla de la base de datos.

Para las declaraciones ACTUALIZAR, ELIMINAR e INSERTAR, InnoDB agregará automáticamente un bloqueo exclusivo (X) al conjunto de datos involucrado;

Para declaraciones SELECT ordinarias, InnoDB no agrega ningún bloqueo;


1.3.4 Preparación de casos innodb admite bloqueos transaccionales a nivel de fila

create table test_innodb_lock(
	id int(11),
	name varchar(16),
	sex varchar(1)
)engine = innodb default charset=utf8;

insert into test_innodb_lock values(1,'100','1');
insert into test_innodb_lock values(3,'3','1');
insert into test_innodb_lock values(4,'400','0');
insert into test_innodb_lock values(5,'500','1');
insert into test_innodb_lock values(6,'600','0');
insert into test_innodb_lock values(7,'700','0');
insert into test_innodb_lock values(8,'800','1');
insert into test_innodb_lock values(9,'900','1');
insert into test_innodb_lock values(1,'200','0');

create index idx_test_innodb_lock_id on test_innodb_lock(id);
create index idx_test_innodb_lock_name on test_innodb_lock(name);

1.3.5 Demostración básica de bloqueo de filas ---- Transacción de soporte

SESIÓN 1 SESIÓN-2

Desactivar la confirmación automática

Desactivar la confirmación automática

Todos los datos se pueden consultar normalmente.

Todos los datos se pueden consultar normalmente.

Consultar datos con id 3

Obtener los datos con id 3

Actualice los datos con id 3, pero no los envíe;

Actualizar los datos con id 3, en estado de espera.

Enviar la transacción a través de compromiso

Desbloqueando, la actualización continúa normalmente.  

Arriba, se operan los datos de la misma fila y luego se muestran los datos de diferentes filas:

Dado que no es la misma fila que la operación Sesión-1, adquiera el bloqueo de fila actual y realice la actualización;
Actualice los datos cuya identificación es 3, obtenga el bloqueo de fila normalmente y ejecute la actualización;

nivel de fila:

Dividido en: Bloqueo compartido: este bloqueo se agregará automáticamente cuando se ejecute la selección. No afecta otras operaciones.

Bloqueo exclusivo: este bloqueo se agrega automáticamente cuando se realiza una operación de actualización. Actualizar operaciones que afectan a otras transacciones


1.4 Bloqueo pesimista y bloqueo optimista

  • Bloqueo optimista: cada vez que va a obtener los datos, piensa que otros no los modificarán, por lo que no se bloqueará, pero cuando envíe la actualización, juzgará si otros han actualizado los datos durante este período.
  • Bloqueo pesimista: cada vez que va a obtener los datos, piensa que otros los modificarán, por lo que cada vez que obtenga los datos, los bloqueará, de modo que otros se detendrán si quieren obtener los datos hasta que se libere el bloqueo. .
  • El bloqueo optimista de la base de datos debe ser implementado por usted mismo, agregue un campo de versión en la tabla y agregue 1 al valor exitoso de cada modificación, de modo que cada vez que lo modifique, primero compare si la versión que posee es consistente con la versión actual de la base de datos. Modificar para que se implemente el bloqueo optimista.

Supongo que te gusta

Origin blog.csdn.net/WQGuang/article/details/132219911
Recomendado
Clasificación