El bloqueo de registros es la técnica que impide el acceso simultáneo a los datos de una base de datos , para evitar resultados inconsistentes.
El ejemplo clásico lo ilustran dos empleados bancarios que intentan actualizar la misma cuenta bancaria con dos transacciones diferentes. Ambos recuperan (es decir, copian) el registro de la cuenta . El empleado 1 aplica y guarda una transacción. El empleado 2 aplica una transacción diferente a su copia guardada y guarda el resultado, basándose en el registro original y sus cambios, sobrescribiendo la transacción ingresada por el empleado 1. El registro ya no refleja la primera transacción, como si nunca se hubiera realizado.
Una forma sencilla de evitar esto es bloquear el archivo mientras un usuario modifica un registro, de modo que ningún otro usuario pueda guardar datos. Esto evita que los registros se sobrescriban incorrectamente, pero permite procesar solo un registro a la vez, impidiendo que otros usuarios que necesiten editar registros simultáneamente puedan hacerlo.
Para permitir que varios usuarios editen una tabla de base de datos simultáneamente y evitar inconsistencias causadas por el acceso sin restricciones, se puede bloquear un único registro al recuperarlo para su edición o actualización. A cualquier persona que intente recuperar el mismo registro para editarlo se le deniega el acceso de escritura debido al bloqueo (aunque, según la implementación, es posible que pueda visualizar el registro sin editarlo). Una vez que se guarda el registro o se cancelan las ediciones, se libera el bloqueo. Los registros nunca se pueden guardar de forma que sobrescriban otros cambios, preservando así la integridad de los datos .
En la teoría de la administración de bases de datos, el bloqueo se utiliza para implementar el aislamiento entre múltiples usuarios de la base de datos. Esta es la "I" del acrónimo ACID .
Jim Gray escribió una descripción exhaustiva y autorizada del sistema de cierre . [ 1 ]
Granularidad de los cierres
Si los empleados del banco (siguiendo el ejemplo anterior) atienden a dos clientes, pero sus cuentas se encuentran en un mismo libro mayor, entonces sería necesario que cada empleado tuviera acceso al libro mayor completo, o a una o más tablas de la base de datos , para editarlas y así completar una transacción de forma individual ( bloqueo de archivos ). Si bien este método es seguro, puede ocasionar esperas innecesarias.
Si los empleados pueden retirar una página del libro mayor que contenga la cuenta del cliente actual (además de otras cuentas), podrán atender a varios clientes simultáneamente , siempre que la cuenta de cada cliente se encuentre en una página diferente. Si dos clientes tienen cuentas en la misma página, solo se podrá atender a uno a la vez. Esto es similar al bloqueo de página en una base de datos.
Se logra un mayor nivel de granularidad si cada cuenta individual puede ser gestionada por un empleado. Esto permitiría atender a cualquier cliente sin tener que esperar a que otro acceda a una cuenta diferente. Esto es similar a un bloqueo a nivel de registro y suele ser el nivel más alto de granularidad de bloqueo en un sistema de gestión de bases de datos.
En una base de datos SQL , un registro se suele denominar "fila".
La introducción de bloqueos granulares (de subconjuntos) crea la posibilidad de una situación denominada interbloqueo . El interbloqueo es posible cuando se utiliza el bloqueo incremental (bloquear una entidad y luego bloquear una o más entidades adicionales). Por ejemplo, si dos clientes bancarios solicitan a dos empleados que obtengan la información de sus cuentas para transferir dinero a otras cuentas, ambas cuentas quedarían bloqueadas. Si los clientes les indicaran a los empleados que la transferencia se realizaría entre las cuentas del otro, estos buscarían las otras cuentas, pero las encontrarían "en uso" y esperarían a que se las devolvieran. Sin saberlo, ambos empleados se esperan mutuamente y ninguno puede completar la transacción hasta que el otro ceda y devuelva la cuenta. Se utilizan diversas técnicas para evitar este tipo de problemas.
Uso de cerraduras
Es necesario gestionar los bloqueos de registros entre las entidades que los solicitan, de manera que ninguna entidad reciba un servicio excesivo mediante concesiones sucesivas y ninguna otra quede efectivamente bloqueada. Las entidades que solicitan un bloqueo pueden ser aplicaciones (programas) individuales o un procesador completo.
La aplicación o el sistema deben diseñarse de forma que cualquier bloqueo se mantenga durante el menor tiempo posible. La lectura de datos, sin funciones de edición, no requiere bloqueo, y la lectura de registros bloqueados suele estar permitida.
Se pueden solicitar dos tipos principales de cerraduras:
cerraduras exclusivas
Los bloqueos exclusivos son mantenidos exclusivamente por una sola entidad, generalmente con el propósito de escribir en el registro. Si el esquema de bloqueo se representara mediante una lista, la lista de titulares contendría solo una entrada. Dado que este tipo de bloqueo impide el procesamiento de cualquier otra entidad que requiera el bloqueo, se debe tener cuidado con lo siguiente:
- Asegúrese de que el candado se mantenga abierto el menor tiempo posible;
- No mantenga el bloqueo durante las llamadas al sistema o a las funciones cuando la entidad ya no se esté ejecutando en el procesador; esto puede provocar un interbloqueo;
- Asegúrese de que, si la entidad se cierra inesperadamente por cualquier motivo, se libere el bloqueo.
Los usuarios que no poseen el bloqueo (también conocidos como " esperadores ") pueden permanecer en una lista que se atiende de forma rotativa o en una cola FIFO . Esto garantiza que cualquier posible esperador tenga la misma oportunidad de obtener el bloqueo y no quede excluido. Para acelerar aún más el proceso, si una entidad se encuentra inactiva esperando un bloqueo, el rendimiento mejora si se le notifica la concesión, en lugar de descubrirla mediante un mecanismo de activación por tiempo de espera del sistema.
Cerraduras compartidas
Los bloqueos compartidos se diferencian de los bloqueos exclusivos en que la lista de titulares puede contener varias entradas. Los bloqueos compartidos permiten que todos los titulares lean el contenido del registro, sabiendo que este no se puede modificar hasta que todos lo hayan liberado. Los bloqueos exclusivos no se pueden obtener cuando un registro ya está bloqueado (de forma exclusiva o compartida) por otra entidad.
Si se ponen en cola solicitudes de bloqueo para la misma entidad, una vez que se concede un bloqueo compartido, también se pueden conceder los demás bloqueos compartidos que estén en cola. Si se encuentra un bloqueo exclusivo a continuación en la cola, deberá esperar hasta que se hayan liberado todos los bloqueos compartidos. Al igual que con los bloqueos exclusivos, estos bloqueos compartidos deben mantenerse el menor tiempo posible.
Véase también
Referencias
- Control de concurrencia
- Procesamiento de transacciones