Hablando sobre el uso del bloqueo optimista y el bloqueo pesimista de MySQL

 

Este artículo presenta principalmente el uso específico de bloqueos optimistas y bloqueos pesimistas en MySQL. El artículo lo presenta con gran detalle a través de código de ejemplo. Tiene cierto valor de aprendizaje de referencia para el estudio o trabajo de todos. Los amigos que lo necesiten seguirán al editor de Micro Point. Lectura ,

Introducción al candado pesimista (enciclopedia):

El bloqueo pesimista, como su nombre indica, se refiere a una actitud conservadora hacia la modificación de los datos por parte del mundo exterior (incluidas otras transacciones actuales del sistema y el procesamiento de transacciones de sistemas externos), por lo que durante todo el proceso de procesamiento de datos, los datos están bloqueados. estado. La implementación del bloqueo pesimista a menudo se basa en el mecanismo de bloqueo proporcionado por la base de datos (solo el mecanismo de bloqueo proporcionado por la capa de la base de datos puede garantizar realmente la exclusividad del acceso a los datos. De lo contrario, incluso si el mecanismo de bloqueo se implementa en este sistema, no hay garantiza que el sistema externo no modificará los datos).

Ejemplo de escenario de uso: tome MySQL InnoDB como ejemplo

Hay un campo de estado en la tabla de productos. Un estado de 1 significa que el producto no se ha pedido y un estado de 2 significa que el producto se ha pedido. Luego, cuando realizamos un pedido de un determinado producto, debemos asegurarnos de que que el estado del producto es 1. Supongamos que la identificación del producto es 1.

1 Si no se utiliza ningún candado, el método de operación es el siguiente:

1

2

3

4

5

6

//1.查询出商品信息

select status from t_goods where id=1;

//2.根据商品信息生成订单

insert into t_orders (id,goods_id) values (null,1);

//3.修改商品status为2

update t_goods set status=2;

Es probable que el escenario anterior cause problemas en el caso de un alto acceso simultáneo.

Como se mencionó anteriormente, solo se puede realizar un pedido del producto cuando el estado de la mercancía es 1. En el primer paso anterior, el estado del producto consultado es 1. Pero cuando realizamos el tercer paso de la operación de Actualización, es posible que alguien más haya realizado un pedido del producto primero y haya modificado el estado de la mercancía a 2, pero no sabemos que los datos han sido modificados, lo que puede causar lo mismo. producto a ser El pedido se realizó dos veces, lo que hace que los datos sean inconsistentes. Entonces este método no es seguro.

2 Utilice el bloqueo pesimista para lograr:

En el escenario anterior, hay un proceso de procesamiento de pedidos desde la consulta hasta la modificación de la información del producto. El principio de utilizar el bloqueo pesimista es que después de consultar la información del producto, bloqueamos los datos actuales hasta que completamos la modificación. Desbloqueado. Luego, en este proceso, debido a que los bienes están bloqueados, no habrá ningún tercero que los modifique.

Nota: Para usar el bloqueo pesimista, debemos desactivar el atributo de confirmación automática de la base de datos MySQL, porque MySQL usa el modo de confirmación automática de forma predeterminada, lo que significa que cuando realiza una operación de actualización, MySQL confirmará inmediatamente el resultado.

Podemos usar el comando para configurar MySQL en modo sin confirmación automática:

1

set autocommit=0;

Después de configurar el compromiso automático, podemos realizar nuestras actividades normales. detalles de la siguiente manera:

1

2

3

4

5

6

7

8

9

10

11

//0.开始事务

begin;/begin work;/start transaction; (三者选一就可以)

//1.查询出商品信息

select status from t_goods where id=1 for update;

//2.根据商品信息生成订单

insert into t_orders (id,goods_id) values (null,1);

//3.修改商品status为2

update t_goods set status=2;

//4.提交事务

commit;/commit work;

Nota: El inicio/compromiso anterior es el inicio y el final de la transacción. Debido a que desactivamos el compromiso automático de MySQL en el paso anterior, debemos controlar manualmente el envío de la transacción, que no se detallará aquí.

En el primer paso anterior, realizamos una operación de consulta: seleccione el estado de t_goods donde id=1 para actualizar;

A diferencia de las consultas ordinarias, utilizamos el método select...for update, que implementa un bloqueo pesimista a través de la base de datos. En este momento, en la tabla t_goods, los datos cuya identificación es 1 están bloqueados por nosotros, y otras transacciones deben esperar a que esta transacción se confirme antes de poder ejecutarse. De esta forma podemos asegurarnos de que los datos actuales no serán modificados por otras transacciones.

Nota: Cabe señalar que en una transacción, solo SELECCIONAR... PARA ACTUALIZAR o BLOQUEAR EN MODO COMPARTIR para los mismos datos esperará a que se completen otras transacciones antes de ejecutarse. Generalmente, SELECCIONAR... no se verá afectado por esto. . Tome el ejemplo anterior, cuando ejecuto select status from t_goods donde id=1 para actualizar; Si ejecuto select status de t_goods donde id=1 para actualizar; nuevamente en otra transacción, la segunda transacción esperará el envío de la primera transacción. En este momento, la segunda consulta está bloqueada, pero si ejecuto select status de t_goods donde id = 1; en la segunda transacción, los datos se pueden consultar normalmente y no se verán afectados por la primera transacción.

Reimpreso de: Weidian Reading    https://www.weidianyuedu.com

Supongo que te gusta

Origin blog.csdn.net/weixin_45707610/article/details/131807816
Recomendado
Clasificación