¿Qué es el control de concurrencia?
En la programación de gestión de datos, el control de concurrencia es un mecanismo diseñado para garantizar que las operaciones concurrentes generen resultados precisos. Esos resultados también deben obtenerse de manera oportuna. El control de concurrencia se ve muy a menudo en bases de datos donde hay una memoria caché de información que los usuarios pueden obtener.
Los programadores intentan diseñar una base de datos de tal manera que el efecto de las transacciones importantes en los datos compartidos sea equivalente en serie. Lo que esto significa es que los datos que entran en contacto con conjuntos de transacciones estarían en un cierto estado donde los resultados se pueden obtener si todas las transacciones se ejecutan en serie y en un orden particular. A veces, esos datos no son válidos como resultado de ser modificados por dos transacciones, al mismo tiempo.
Existen múltiples formas de garantizar que las transacciones se ejecuten una tras otra, incluido el uso de la exclusión mutua y la creación de un recurso que decida qué transacciones tienen acceso. Sin embargo, esto es excesivo y no permitirá que un programador se beneficie del control de concurrencia en un sistema distribuido. El control de concurrencia permite la ejecución simultánea de múltiples transacciones mientras mantiene estas transacciones alejadas entre sí, asegurando la linealización. Una forma de implementar el control de concurrencia es el uso de un bloqueo exclusivo en un recurso particular para ejecuciones de transacciones en serie que comparten recursos. Las transacciones bloquearán un objeto destinado a ser utilizado, y si alguna otra transacción solicita el objeto que está bloqueado, esa transacción debe esperar a que el objeto se desbloquee.
La implementación de este método en sistemas distribuidos involucra administradores de bloqueos, servidores que emiten bloqueos de recursos. Esto es muy similar a los servidores para exclusiones mutuas centralizadas, donde los clientes pueden solicitar bloqueos y enviar mensajes para la liberación de bloqueos en un recurso en particular. Sin embargo, la preservación de la ejecución en serie sigue siendo necesaria para el control de concurrencia. Si dos transacciones separadas acceden a un conjunto de objetos similar, los resultados deben ser similares y como si estas transacciones se ejecutaran en un orden particular. Para garantizar el orden de acceso a un recurso, se introduce el bloqueo en dos fases, lo que significa que las transacciones no tienen permitido nuevos bloqueos al liberar un bloqueo por separado.
En el bloqueo de dos fases para el control de concurrencia, su fase inicial se considera la fase de crecimiento, donde la transacción adquiere el bloqueo necesario. La siguiente fase se considera una fase de reducción, en la que la transacción tiene sus bloqueos liberados. Hay problemas con este tipo de bloqueo. Si las transacciones cancelan, otras transacciones pueden usar datos de objetos modificados y desbloqueados por transacciones canceladas. Esto daría lugar a que se anulen otras transacciones.