* Acceso simultáneo: Múltiples entidades (usuarios, transacciones, procesos, hilos) están interactuando con los mismos datos aproximadamente al mismo tiempo.
* Datos compartidos: Los datos a los que se accede se comparten entre estas múltiples entidades. Estos datos podrían residir en una base de datos, un archivo, memoria o cualquier otro almacenamiento compartido.
* potencial para conflictos: La principal preocupación con la concurrencia es el potencial de conflictos. Estos conflictos surgen cuando múltiples entidades intentan modificar los mismos datos simultáneamente. Esto puede conducir a resultados inconsistentes, incorrectos o impredecibles. El ejemplo clásico es el problema de "actualización perdida" donde una actualización sobrescribe a otra.
Tipos de mecanismos de control de concurrencia:
Se utilizan varias técnicas para administrar y resolver problemas de concurrencia, incluidos:
* Bloqueo: Este es un enfoque común en el que una entidad adquiere un bloqueo en los datos antes de acceder a él, evitando que otras entidades lo modifiquen hasta que se libere el bloqueo. Existen diferentes mecanismos de bloqueo, como cerraduras exclusivas (solo una entidad puede acceder), bloqueos compartidos (múltiples entidades pueden leer pero no escribir) y diversas granularidades de bloqueo (nivel de fila, nivel de página, a nivel de mesa).
* Control de concurrencia optimista (OCC): Este enfoque supone que los conflictos son raros. Una entidad lee los datos, realiza cambios y luego verifica antes de realizar los cambios si los datos han sido modificados por otra entidad. Si se detecta un conflicto, la transacción se retira hacia atrás.
* Control de concurrencia pesimista (PCC): Este enfoque supone que los conflictos son frecuentes. Utiliza mecanismos de bloqueo agresivamente para evitar que ocurran conflictos en primer lugar.
* Versión: Se rastrea cada versión de los datos, lo que permite a varios usuarios trabajar en los mismos datos simultáneamente sin interferir directamente entre sí. Los conflictos se resuelven fusionando o seleccionando la versión apropiada.
* Timestamping: A cada transacción se le asigna una marca de tiempo, y el sistema asegura que las transacciones se procesen en orden de marca de tiempo, evitando conflictos.
Consecuencias del mal control de la concurrencia:
* Inconsistencia de datos: Los datos se corrompen o no son confiables debido a actualizaciones contradictorias.
* Actualizaciones perdidas: Una actualización sobrescribe a otra, lo que resulta en la pérdida de datos.
* Dirty Reads: Una transacción lee datos que han sido modificados por otra transacción pero que aún no se ha cometido.
* lecturas no repetibles: Una transacción lee los mismos datos varias veces, pero los datos han sido cambiados por otra transacción entre lecturas.
* Phantom dice: Una transacción ejecuta una consulta dos veces, y la segunda consulta devuelve filas adicionales que fueron agregadas por otra transacción entre las dos consultas.
En resumen, la concurrencia de datos es un aspecto crítico del desarrollo de software, especialmente en sistemas con múltiples usuarios o procesos que acceden a recursos compartidos. La implementación de mecanismos de control de concurrencia adecuados es esencial para garantizar la integridad de los datos y la confiabilidad de la aplicación.