[Elemental] Comprensión profunda del bloqueo optimista y el bloqueo pesimista

[Elemental] Comprensión profunda del bloqueo optimista y el bloqueo pesimista

Como se mencionó en el mecanismo de bloqueo de la base de datos, la tarea del control de concurrencia en el sistema de administración de la base de datos (DBMS) es garantizar que el aislamiento y la unidad de la transacción y la unidad de la base de datos no se destruyan cuando varias transacciones acceden a los mismos datos en la base de datos al mismo tiempo.

El control de concurrencia optimista (bloqueo optimista) y el control de concurrencia pesimista (bloqueo pesimista) son los principales métodos técnicos utilizados para el control de concurrencia.

Ya sea un bloqueo pesimista o un bloqueo optimista, es un concepto definido por las personas y puede considerarse como una especie de pensamiento. De hecho, no es solo el concepto de bloqueo optimista y bloqueo pesimista en los sistemas de bases de datos relacionales, sino también conceptos similares como Memcache, Hibernate y Tair.

Para diferentes escenarios comerciales, se deben seleccionar diferentes métodos de control de concurrencia. Por lo tanto, no entienda estrictamente el control de concurrencia optimista y el control de concurrencia pesimista como conceptos en el DBMS, y mucho menos los confunda con los mecanismos de bloqueo proporcionados en los datos (bloqueos de fila, bloqueos de tabla, bloqueos exclusivos y bloqueos compartidos). De hecho, en DBMS, el bloqueo pesimista se logra utilizando el mecanismo de bloqueo proporcionado por la propia base de datos.

Aprendamos sobre el bloqueo pesimista y el bloqueo optimista respectivamente.

Bloqueo pesimista


En los sistemas de administración de bases de datos relacionales, el control de concurrencia pesimista (también conocido como "bloqueo pesimista", Control de concurrencia pesimista, abreviado "PCC") es un método de control de concurrencia. Puede evitar que una transacción modifique los datos de una manera que afecte a otros usuarios. Si la operación realizada por una transacción está bloqueada para una determinada fila de datos, solo cuando la transacción libera el bloqueo, otras transacciones pueden realizar operaciones que entren en conflicto con el bloqueo.
El control de simultaneidad pesimista se utiliza principalmente en entornos con una intensa contención de datos y en entornos donde el costo de usar bloqueos para proteger los datos cuando ocurren conflictos de simultaneidad es menor que el costo de revertir transacciones.

Bloqueo pesimista, como su nombre indica, se refiere a una actitud conservadora (pesimista) sobre la modificación de los datos por parte del mundo exterior (incluidas otras transacciones actuales en este sistema y el procesamiento de transacciones de sistemas externos). Por lo tanto, en todo el proceso de procesamiento de datos, Los datos están bloqueados. La realización del bloqueo pesimista a menudo se basa en el mecanismo de bloqueo proporcionado por la base de datos (y 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 se puede garantizar que el sistema externo no se modifique. datos)

En la base de datos, el proceso de bloqueo pesimista es el siguiente:

Antes de modificar cualquier registro, intente agregar bloqueo exclusivo al registro.

Si el bloqueo falla, lo que indica que se está modificando el registro, es posible que la consulta actual tenga que esperar o lanzar una excepción. El desarrollador determina el método de respuesta específico de acuerdo con las necesidades reales.

Si el bloqueo se bloquea correctamente, el registro se puede modificar y la transacción se desbloqueará después de que se complete la transacción.

Mientras tanto, si hay otras operaciones que modifican el registro o agregan un bloqueo exclusivo, esperará a que lo desbloqueemos o arrojemos una excepción directamente.

Bloqueo pesimista en MySQL InnoDB

Para usar el bloqueo pesimista, debemos desactivar el atributo autocommit de la base de datos mysql, porque MySQL usa el modo autocommit por defecto, es decir, cuando realizas una operación de actualización, MySQL enviará inmediatamente el resultado. establecer autocommit = 0;

//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;

En la declaración de consulta anterior, usamos el método select ... for update, de modo que el bloqueo pesimista se realiza abriendo el bloqueo exclusivo. En este momento, en la tabla t_goods, los datos con id 1 están bloqueados por nosotros y otras transacciones solo se pueden ejecutar después de que esta transacción se haya confirmado. De esta forma podemos asegurarnos de que los datos actuales no serán modificados por otras transacciones.

Como mencionamos anteriormente, usar select ... for update bloqueará los datos, pero debemos prestar atención a algunos niveles de bloqueo, el bloqueo de nivel de fila predeterminado de MySQL InnoDB. Los bloqueos de nivel de fila se basan en índices. Si una instrucción SQL no usa un índice, no se usarán bloqueos de nivel de fila y se usarán bloqueos de nivel de tabla para bloquear toda la tabla. Esto requiere atención.

Pros y contras

El control de concurrencia pesimista es en realidad una estrategia conservadora de "buscar cerraduras antes del acceso", que proporciona una garantía para la seguridad del procesamiento de datos. Pero en términos de eficiencia, el mecanismo de procesamiento de bloqueos causará una sobrecarga adicional para la base de datos y aumentará la posibilidad de interbloqueos; además, debido a que no habrá conflictos en el procesamiento de transacciones de solo lectura, no es necesario usar bloqueos. Solo puede aumentar la carga del sistema; también reduce el paralelismo. Si una transacción bloquea una fila de datos, otras transacciones deben esperar a que la transacción se complete antes de procesar el número de filas.

Cerradura optimista

En los sistemas de administración de bases de datos relacionales, el control de concurrencia optimista (también conocido como "bloqueo optimista", Control de concurrencia optimista, abreviado "OCC") es un método de control de concurrencia. Asume que las transacciones simultáneas de varios usuarios no se afectarán entre sí durante el procesamiento, y cada transacción puede procesar la parte de los datos afectados por cada uno sin bloquear. Antes de realizar la actualización de datos, cada transacción primero verificará si otras transacciones han modificado los datos después de que la transacción lee los datos. Si se actualizan otras transacciones, la transacción que se está confirmando se revertirá. El profesor HTKung propuso por primera vez el control optimista de transacciones.

Bloqueo optimista (bloqueo optimista) En relación con el bloqueo pesimista, la suposición de bloqueo optimista cree que los datos no causarán conflictos en circunstancias normales, por lo que cuando los datos se envían y actualizan, detectará formalmente si los datos entran en conflicto o no. Si se encuentra un conflicto , Deje que el usuario devuelva información incorrecta y deje que el usuario decida cómo hacerlo.

En comparación con el bloqueo pesimista, el bloqueo optimista no utiliza el mecanismo de bloqueo proporcionado por la base de datos al procesar la base de datos. La forma general de lograr un bloqueo optimista es registrar la versión de los datos.

Versión de datos, un identificador de versión agregado para los datos. Al leer datos, el valor del identificador de versión se lee en conjunto y el identificador de versión se actualiza cada vez que se actualizan los datos. Cuando enviamos la actualización, consideramos que la información de la versión actual del registro correspondiente en la tabla de la base de datos se compara con el ID de la versión que se obtuvo por primera vez. Si el número de versión actual de la tabla de la base de datos es igual al valor del ID de la versión obtenido por primera vez, actualice , De lo contrario, se considera datos caducados.

Hay dos formas de implementar la versión de los datos, la primera es usar el número de versión y la segunda es usar la marca de tiempo.

Utilice números de versión para implementar un bloqueo optimista

Al usar un número de versión, puede especificar un número de versión cuando se inicializan los datos y realizar una operación +1 en el número de versión cada vez que se actualizan los datos. Y juzgue si el número de versión actual es el número de versión más reciente de los datos.


1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};

Pros y contras

El control de concurrencia optimista cree que la probabilidad de carreras de datos entre transacciones es relativamente pequeña, así que hágalo de la manera más directa posible y no bloquee hasta que se confirme, para que no se produzcan bloqueos ni puntos muertos. Pero si simplemente hace esto directamente, aún puede encontrar resultados inesperados. Por ejemplo, dos transacciones leen una determinada fila de la base de datos y la vuelven a escribir en la base de datos después de la modificación. En este momento, se encuentran problemas.
[Elemental] Comprensión profunda del bloqueo optimista y el bloqueo pesimista

La operación realizada por la transacción aplicó un bloqueo a una fila de datos "

Supongo que te gusta

Origin blog.51cto.com/13626762/2545864
Recomendado
Clasificación