Este artículo necesita citas adicionales para su verificación . ( diciembre de 2009 ) |
El bloqueo de registros es la técnica de evitar el acceso simultáneo a los datos de una base de datos , para evitar resultados inconsistentes.
El ejemplo clásico lo demuestran dos empleados bancarios que intentan actualizar la misma cuenta bancaria para dos transacciones diferentes. Los empleados 1 y 2 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 hubiera tenido lugar.
Una forma sencilla de evitar esto es bloquear el archivo cada vez que un usuario modifica un registro, de modo que ningún otro usuario pueda guardar los datos. Esto evita que los registros se sobrescriban incorrectamente, pero permite que solo se procese un registro a la vez, lo que impide que otros usuarios editen registros al mismo tiempo.
Para permitir que varios usuarios editen una tabla de base de datos al mismo tiempo y también evitar inconsistencias creadas por el acceso sin restricciones, se puede bloquear un solo registro cuando se recupera para editarlo o actualizarlo. A cualquier persona que intente recuperar el mismo registro para editarlo se le niega el acceso de escritura debido al bloqueo (aunque, según la implementación, es posible que pueda ver 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 para sobrescribir otros cambios, lo que preserva la integridad de los datos .
En la teoría de la gestión de bases de datos, el bloqueo se utiliza para implementar el aislamiento entre múltiples usuarios de bases de datos. Esta es la "I" en el acrónimo ACID .
Jim Gray escribió una descripción exhaustiva y autorizada del bloqueo . [1]
Si los empleados del banco (para seguir la ilustración anterior) atienden a dos clientes, pero sus cuentas están contenidas en un solo libro mayor, entonces todo el libro mayor, o una o más tablas de la base de datos , deberían estar disponibles para que los empleados los editen para que cada uno complete una transacción, una a la vez ( bloqueo de archivos ). Si bien es seguro, este método puede causar esperas innecesarias.
Si los empleados pueden eliminar una página del libro mayor que contiene la cuenta del cliente actual (además de varias otras cuentas), se podrá atender a varios clientes simultáneamente , siempre que la cuenta de cada cliente se encuentre en una página diferente a las demás. Si dos clientes tienen cuentas en la misma página, solo se podrá atender a uno a la vez. Esto es análogo a un bloqueo a nivel de página en una base de datos.
Se logra un mayor grado de granularidad si cada cuenta individual puede ser atendida por un empleado. Esto permitiría atender a cualquier cliente sin tener que esperar a otro cliente que esté accediendo a una cuenta diferente. Esto es análogo a un bloqueo a nivel de registro y normalmente es el mayor grado de granularidad de bloqueo en un sistema de gestión de bases de datos.
En una base de datos SQL , un registro normalmente se denomina "fila".
La introducción de bloqueos granulares (subconjuntos) crea la posibilidad de una situación llamada bloqueo mutuo . El bloqueo mutuo es posible cuando se utiliza el bloqueo incremental (bloquear una entidad y luego bloquear una o más entidades adicionales). Para ilustrarlo, si dos clientes bancarios pidieran a dos empleados que obtuvieran la información de su cuenta para poder transferir dinero a otras cuentas, las dos cuentas quedarían esencialmente bloqueadas. Luego, si los clientes les dijeran a sus empleados que el dinero se iba a transferir a las cuentas de cada uno, los empleados buscarían las otras cuentas pero las encontrarían "en uso" y esperarían a que se las devolvieran. Sin saberlo, los dos empleados se esperan el uno al otro, y ninguno de ellos puede completar su transacción hasta que el otro se dé por vencido y devuelva la cuenta. Se utilizan varias técnicas para evitar este tipo de problemas.
Los bloqueos de registros deben gestionarse entre las entidades que los solicitan, de modo que ninguna entidad reciba demasiados servicios mediante concesiones sucesivas y ninguna otra entidad quede bloqueada de manera efectiva. Las entidades que solicitan un bloqueo pueden ser aplicaciones individuales (programas) o un procesador completo.
La aplicación o el sistema deben diseñarse de manera que cualquier bloqueo se mantenga durante el menor tiempo posible. La lectura de datos, sin funciones de edición, no requiere un bloqueo y, por lo general, se permite la lectura de registros bloqueados.
Se pueden solicitar dos tipos principales de cerraduras:
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 estuviera representado por una lista, la lista de titulares contendría solo una entrada. Dado que este tipo de bloqueo bloquea efectivamente a cualquier otra entidad que requiera el procesamiento del bloqueo, se debe tener cuidado para:
Los no titulares del bloqueo (también conocidos como " en espera" ) pueden ser retenidos en una lista que se atiende de manera rotatoria o en una cola FIFO . Esto garantizaría que cualquier posible "en espera" tenga las mismas posibilidades de obtener el bloqueo y no quedar bloqueado. Para acelerar aún más el proceso, si una entidad se ha quedado dormida esperando un bloqueo, el rendimiento mejora si se le notifica la concesión, en lugar de descubrirlo en algún tipo de reactivación impulsada por un tiempo de espera del sistema.
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 el registro no se puede modificar hasta que todos los titulares hayan liberado el bloqueo. 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 todos los bloqueos compartidos que estén en cola. Si se encuentra un bloqueo exclusivo a continuación en la cola, debe esperar hasta que se hayan liberado todos los bloqueos compartidos. Al igual que con los bloqueos exclusivos, estos bloqueos compartidos deben mantenerse durante el menor tiempo posible.