Principio de implementación del control de concurrencia de la base de datos

Autor: Zen y el arte de la programación informática

1. Introducción

Descripción general

El control de concurrencia es un componente muy importante en los sistemas de gestión de bases de datos relacionales. Su función es garantizar que las operaciones de varios usuarios sobre los mismos datos en un entorno concurrente no causen inconsistencia en los datos. Para garantizar la exactitud, integridad y coherencia de los datos, el mecanismo de control de concurrencia puede proporcionar garantías como aislamiento de transacciones, durabilidad de las transacciones y capacidades de recuperación de reversión. Este artículo comenzará con los conceptos básicos del control de concurrencia, presentará conceptos como transacciones y bloqueos, analizará en detalle los principios de implementación del control de concurrencia de la base de datos y los desarrollará más en función de casos reales.

Preparación del conocimiento

Antes de leer este artículo, debe tener cierta comprensión de los siguientes puntos de conocimiento:

  • Transacción
  • concurrencia
  • Cerrar
  • Protocolo de compromiso de dos fases
  • Programación serializable

2. Concepto de control de concurrencia

El control de concurrencia es un conjunto de soluciones que se utilizan para resolver problemas de conflictos de operación de bases de datos, incluidos conflictos de lectura y escritura, conflictos de modificación dentro de transacciones y conflictos de acceso a través de límites de transacciones, etc. El control de concurrencia es un subsistema independiente en un sistema de gestión de bases de datos relacionales y es responsable de coordinar la interacción entre múltiples transacciones ejecutadas simultáneamente para que la base de datos pueda mantener la coherencia e integridad de los datos cuando varios usuarios acceden a ella al mismo tiempo.

2.1 Transacciones

Una transacción es una colección de una o más declaraciones SQL administradas por el sistema de gestión de bases de datos en su conjunto. Las transacciones proporcionan una forma de manejar una serie de operaciones de bases de datos, incluidas operaciones de lectura, escritura y actualización de datos. Las transacciones deben tener cuatro propiedades (propiedades ACID):

  • Atomicidad: Una transacción es una unidad de trabajo indivisible en la que ocurren todas las operaciones o ninguna. Si una operación en una transacción falla, toda la transacción no tendrá éxito y el sistema de base de datos mantendrá el estado anterior sin inconsistencia de datos.
  • Consistencia: la transacción debe estar en el estado de coherencia de la base de datos, lo que significa que todos los resultados de la ejecución son correctos, es decir, una transacción debe estar en un estado coherente antes y después de la ejecución.
  • Aislamiento: la ejecución de una transacción no puede ser interferida por otras transacciones, es decir, las operaciones dentro de la transacción y los datos utilizados están aislados de otras transacciones, y las transacciones ejecutadas simultáneamente no pueden interferir entre sí.
  • Durabilidad: una vez que se confirma una transacción, los cambios que realiza en la base de datos deben guardarse permanentemente. Las operaciones o fallos posteriores no deberían tener ningún impacto en él.

2.2 Concurrencia

La concurrencia se refiere a dos o más transacciones (o comandos) que se ejecutan en el mismo período de tiempo, acceden conjuntamente a los mismos recursos de datos y no existe ningún requisito de que estas transacciones se ejecuten en un orden específico. Esto conduce a incertidumbre en los datos e inconsistencia temporal, es decir, cuando dos o más transacciones operan con ciertos datos al mismo tiempo, se pueden producir resultados indefinidos.

2.3 Bloquear

El bloqueo es un mecanismo utilizado para evitar el acceso simultáneo a los recursos de la base de datos. Los bloqueos proporcionan un medio para bloquear y desbloquear objetos de la base de datos al principio y al final de una transacción. Cuando una transacción solicita bloquear un recurso, si el recurso ya está ocupado por otras transacciones, la transacción solo puede esperar o renunciar al recurso.

2.4 Protocolo de confirmación de dos fases

El protocolo de compromiso de dos fases es un modelo de transacción distribuida. Este modelo divide el proceso de confirmación de una transacción en dos etapas: la primera etapa, la etapa de preparación, cuando la transacción pregunta si se puede ejecutar. Este paso implica bloquear recursos y verificar el estado de la transacción; la segunda etapa, la etapa de confirmación, Se presenta formalmente la transacción y se liberan los recursos. Si hay solicitudes o bloqueos de otras transacciones en la primera fase, la transacción actual ingresa al estado de bloqueo hasta que se obtengan los bloqueos necesarios y finalmente se puede enviar la transacción.

2.5 Programación serializable

La programación serializable es una estrategia de programación de transacciones de bases de datos. En la programación serializable, cada transacción se ejecuta en orden cronológico. Cada transacción solo puede ver los resultados confirmados de la transacción anterior y no puede ver los resultados intermedios de otras transacciones. Esta estrategia puede garantizar la coherencia e integridad de los datos, pero a costa de un rendimiento deficiente.

3. Principio de implementación del control de concurrencia

El propósito del control de concurrencia es principalmente evitar la inconsistencia de los datos causada por múltiples transacciones o usuarios que operan los mismos datos al mismo tiempo. En los sistemas de bases de datos, el control de concurrencia se implementa principalmente mediante el mecanismo de bloqueo. El mecanismo de bloqueo garantiza que una transacción solo pueda acceder a un determinado recurso en cualquier momento y que otras transacciones solo puedan utilizarlo después de que la transacción libere el bloqueo correspondiente. Cuando varias transacciones intentan actualizar o leer recursos compartidos al mismo tiempo, el sistema de administración de bases de datos generalmente usa dos métodos para evitar conflictos, uno es el control de concurrencia basado en bloqueos y el otro es el control de concurrencia basado en marcas de tiempo.

3.1 Control de concurrencia basado en bloqueos

El control de concurrencia basado en bloqueos es el método de control de concurrencia más simple. En este enfoque, el sistema de gestión de bases de datos mantiene una estructura de datos global que contiene información sobre los bloqueos que posee cada transacción. Cuando una transacción quiere bloquear un recurso, primero verifica si el recurso ha sido bloqueado por otras transacciones. Si el recurso ha sido bloqueado, la transacción debe esperar a que se libere el bloqueo y continuar la ejecución hasta obtener el bloqueo. Los bloqueos pueden ser bloqueos exclusivos o bloqueos compartidos, y diferentes modos de bloqueo corresponden a diferentes estrategias de control de concurrencia.

3.1.1 Bloqueo exclusivo

Los bloqueos exclusivos, también conocidos como bloqueos de escritura, solo permiten que una transacción escriba en un determinado recurso a la vez. Cuando una transacción adquiere un bloqueo exclusivo sobre un recurso, otras transacciones no pueden bloquear el recurso hasta que la transacción libere el bloqueo.

Por ejemplo, cuando una transacción quiere insertar un registro en una tabla, primero debe bloquear la tabla para evitar que las operaciones de escritura de otras transacciones la afecten.

La ventaja del bloqueo exclusivo es su alta eficiencia, ya que solo escribe en el recurso bloqueado, por lo que no causará inconsistencia. La desventaja es que es fácil llegar a un punto muerto.

3.1.2 Bloqueo compartido

Los bloqueos compartidos, también conocidos como bloqueos de lectura, permiten que múltiples transacciones lean un recurso al mismo tiempo, pero no permiten operaciones de escritura. Cuando una transacción adquiere un bloqueo compartido en un recurso, otras transacciones también pueden agregar bloqueos compartidos al recurso, pero no pueden solicitar bloqueos exclusivos.

Por ejemplo, cuando dos transacciones quieren consultar un registro, pueden crear vistas correspondientes en la base de datos y agregar bloqueos compartidos a las vistas, de modo que las operaciones de consulta se puedan realizar simultáneamente.

La ventaja de los bloqueos compartidos es mejorar la concurrencia, reducir la contención de bloqueos y evitar puntos muertos. La desventaja es que pueden ocurrir inconsistencias.

3.1.3 Protocolo de bloqueo

Los protocolos de bloqueo son algoritmos que definen cómo bloquear un recurso al leer o escribir operaciones y cuándo liberar el bloqueo. El protocolo de bloqueo define dos reglas, una es la regla de entrega de bloqueo y la otra es la regla de terminación de transacción.

La regla de transferencia en bloque estipula que si una transacción T1 agrega un bloqueo X al recurso R, cualquier acceso directo o indirecto a R debe seguir el mismo protocolo de bloqueo. Por ejemplo, si T1 agrega un bloqueo de escritura a X, cualquier acceso a X mediante la transacción T2 debe seguir el protocolo de bloqueo de escritura.

La regla de terminación de transacción estipula que cuando se completa una transacción, debe liberar el bloqueo que contiene; de ​​lo contrario, provocará un punto muerto o inconsistencia de datos.

El protocolo de bloqueo puede prevenir eficazmente interbloqueos, mejorar la concurrencia y eliminar la posibilidad de interbloqueos. La implementación del protocolo de bloqueo es relativamente compleja, pero el trabajo de investigación relacionado también ha logrado grandes avances.

3.2 Control de concurrencia basado en marca de tiempo

Los métodos de control de concurrencia basados ​​​​en marcas de tiempo utilizan marcas de tiempo para registrar la hora de inicio de las transacciones y ordenarlas según la hora de inicio de cada transacción para garantizar el orden relativo entre las transacciones. El administrador de transacciones puede asignar marcas de tiempo a las transacciones o generarlas mediante el sistema de gestión de bases de datos. El método de control de concurrencia basado en marcas de tiempo se caracteriza por su simplicidad y eficiencia, no requiere el mantenimiento de información de bloqueo y es adecuado para la mayoría de las transacciones, pero también existen algunos problemas de concurrencia.

3.3 Implementación del protocolo de confirmación de dos fases

El protocolo de confirmación de dos fases es un modelo de transacción distribuida. Divide el proceso de confirmación de una transacción en dos etapas: la primera etapa, la etapa de preparación, donde la transacción pregunta si se puede ejecutar. Este paso implica bloquear recursos y verificar el estado de la transacción; la segunda etapa, la etapa de envío, la la transacción se presenta formalmente y se liberan los recursos. Si hay solicitudes o bloqueos de otras transacciones en la primera fase, la transacción actual ingresa al estado de bloqueo hasta que se obtengan los bloqueos necesarios y finalmente se puede enviar la transacción.

El proceso de implementación del protocolo de presentación de dos fases es el siguiente:

  1. El coordinador de transacciones (Coordinador) envía mensajes de preparación de transacciones a todos los participantes (Participantes), preguntando si la transacción se puede ejecutar y bloquea los recursos que deben bloquearse.
  2. Si la transacción pregunta si se puede ejecutar y todos los participantes responden SÍ, entra en la fase de preparación.
  3. El coordinador de transacciones envía la información de la operación de la transacción a todos los participantes y luego ingresa a la fase de espera.
  4. Los participantes liberan el bloqueo después de completar el trabajo de preparación de la transacción y luego cada uno informa los resultados de sus operaciones al coordinador de la transacción.
  5. El coordinador de transacciones recopila los resultados de la operación de cada participante y determina si la transacción cumple con las condiciones para el envío. Si los resultados de la operación de todos los participantes son los mismos, la transacción se enviará; de lo contrario, la transacción se cancelará.
  6. Confirme la transacción.

La clave del protocolo de confirmación de dos fases es cómo determinar si los participantes están listos para confirmar la transacción, es decir, si los participantes han liberado todos los bloqueos. Si uno o más participantes no han liberado el bloqueo, la transacción se considera bloqueada y entra en estado de espera. El protocolo de confirmación de dos fases resuelve el problema de sobrecarga de las transacciones largas porque minimiza el tiempo de bloqueo de recursos, pero aún existe el riesgo de pérdida parcial.

3.4 Implementación de programación serializable

La programación serializable es una estrategia de programación de transacciones de bases de datos. En la programación serializable, cada transacción se ejecuta en orden cronológico. Cada transacción solo puede ver los resultados confirmados de la transacción anterior y no puede ver los resultados intermedios de otras transacciones. Esta estrategia puede garantizar la coherencia e integridad de los datos, pero a costa de un rendimiento deficiente.

Hay dos formas de implementar la programación serializable: programación serializable basada en reglas y programación serializable basada en antinormas. La idea básica de la programación serializable basada en reglas es programar de acuerdo con una determinada estrategia de programación durante el proceso de programación para garantizar que la ejecución de las transacciones se ajuste a una secuencia. La programación serializable basada en antiestándares restringe la secuencia de ejecución de las transacciones mediante la introducción de especificaciones.

4. Ejemplo de control de concurrencia

Tomemos el saldo de la cuenta bancaria como ejemplo para analizar dos métodos de control de concurrencia: basado en bloqueo y basado en marca de tiempo.

Supongamos que hay una tabla bank_accountque registra el saldo de la cuenta bancaria y el monto disponible de cada cliente. account_id=1Supongamos que hay dos transacciones A y B, las cuales operan en la misma cuenta : la transacción A necesita account_id=1aumentar el saldo disponible de la cuenta en 100 yuanes, y la transacción B necesita reducir account_id=1el saldo disponible de la cuenta en 50 yuanes.

4.1 Enfoque basado en bloqueos

El método basado en bloqueo consiste en account_id=1bloquear primero la cuenta, luego determinar qué transacciones deben account_id=1bloquearse, qué recursos están bloqueados y solicitar un bloqueo al servicio de bloqueo. El servicio de bloqueo devuelve un candado que se puede utilizar. Si dos transacciones necesitan account_id=1bloquear la cuenta, los tipos de bloqueo obtenidos son diferentes: A obtiene un bloqueo exclusivo y B obtiene un bloqueo compartido. Si una transacción necesita account_id=1bloquear una cuenta y el servicio de bloqueo no puede satisfacer la demanda, la transacción solo puede esperar o renunciar al recurso.

Con la ayuda del servicio de bloqueo, el sistema de base de datos garantiza que no se account_id=1realizarán dos transacciones en la misma cuenta al mismo tiempo, evitando así el problema de la inconsistencia de los datos.

4.2 Método basado en marcas de tiempo

El método basado en marca de tiempo asigna una marca de tiempo de inicio a cada transacción y ordena según la marca de tiempo de inicio de cada transacción. Dado que el sistema de base de datos siempre clasifica las transacciones de marcas de tiempo pequeñas a grandes, todas las transacciones dentro del mismo período de tiempo se pueden ejecutar en orden relativo, asegurando así el orden relativo entre transacciones.

account_id=1Dado que las horas de inicio de las dos transacciones son diferentes, las operaciones en la misma cuenta no se pueden realizar simultáneamente entre ellas . Sin embargo, el método basado en marcas de tiempo también puede garantizar la coherencia e integridad de los datos, pero el mecanismo de bloqueo no.

Supongo que te gusta

Origin blog.csdn.net/universsky2015/article/details/133446442
Recomendado
Clasificación