El control de concurrencia optimista ( OCC ), también conocido como bloqueo optimista , es un método de control de concurrencia sin bloqueo aplicado a sistemas transaccionales como sistemas de gestión de bases de datos relacionales y memoria transaccional de software . OCC asume que múltiples transacciones pueden completarse frecuentemente sin interferir entre sí. Mientras se ejecutan, las transacciones utilizan recursos de datos sin adquirir bloqueos sobre dichos recursos. Antes de confirmarse, cada transacción verifica que ninguna otra transacción haya modificado los datos que ha leído. Si la verificación revela modificaciones conflictivas, la transacción que se está confirmando se revierte y puede reiniciarse. [ 1 ] El control de concurrencia optimista fue propuesto por primera vez en 1979 por HT Kung y John T. Robinson. [ 2 ]
OCC se utiliza generalmente en entornos con baja contención de datos . Cuando los conflictos son poco frecuentes, las transacciones pueden completarse sin el coste de gestionar bloqueos y sin que las transacciones tengan que esperar a que se liberen los bloqueos de otras transacciones, lo que resulta en un mayor rendimiento que otros métodos de control de concurrencia. Sin embargo, si la contención por los recursos de datos es frecuente, el coste de reiniciar repetidamente las transacciones perjudica significativamente el rendimiento, en cuyo caso otros métodos de control de concurrencia pueden ser más adecuados. No obstante, los métodos basados en bloqueos ("pesimistas") también pueden ofrecer un rendimiento deficiente, ya que el bloqueo puede limitar drásticamente la concurrencia efectiva incluso cuando se evitan los interbloqueos.
Fases del control de concurrencia optimista
Las transacciones de control de concurrencia optimistas implican estas fases: [ 2 ]
- Inicio : Registre una marca de tiempo que indique el comienzo de la transacción.
- Modificar : Lee los valores de la base de datos y escribe los cambios de forma provisional.
- Validar : Comprueba si otras transacciones han modificado datos que esta transacción ha utilizado (leído o escrito). Esto incluye transacciones que se completaron después de la hora de inicio de esta transacción y, opcionalmente, transacciones que aún están activas en el momento de la validación.
- Confirmación/Reversión : Si no hay conflicto, todos los cambios surten efecto. Si hay un conflicto, se resuelve, generalmente cancelando la transacción, aunque existen otros métodos de resolución. Es fundamental evitar errores de sincronización entre el momento de la verificación y el momento de la ejecución , especialmente si esta fase y la anterior no se realizan como una única operación atómica .
Uso de la web
La naturaleza sin estado de HTTP hace que el bloqueo sea inviable para las interfaces de usuario web. Es común que un usuario comience a editar un registro y luego lo abandone sin seguir un enlace de "cancelar" o "cerrar sesión". Si se utiliza el bloqueo, otros usuarios que intenten editar el mismo registro deberán esperar hasta que expire el bloqueo del primer usuario.
HTTP proporciona una forma de OCC integrada. La respuesta a una solicitud GET inicial puede incluir una ETag para que las solicitudes PUT posteriores la utilicen en el encabezado If-Match. Cualquier solicitud PUT con una ETag desactualizada en el encabezado If-Match puede ser rechazada. [ 3 ]
Algunos sistemas de gestión de bases de datos ofrecen OCC de forma nativa, sin necesidad de código de aplicación especial. En otros casos, la aplicación puede implementar una capa de OCC fuera de la base de datos, evitando así la espera o la sobrescritura silenciosa de registros. En estos casos, el formulario puede incluir un campo oculto con el contenido original del registro, una marca de tiempo, un número de secuencia o un token opaco. Al enviar el formulario, este campo se compara con la base de datos. Si hay alguna diferencia, se activa el algoritmo de resolución de conflictos.
Ejemplos
- Las páginas de edición de MediaWiki utilizan OCC. [ 4 ]
- Bugzilla utiliza OCC; los conflictos de edición se denominan "colisiones en el aire". [ 5 ]
- El framework Ruby on Rails tiene una API para OCC. [ 6 ]
- El framework Grails utiliza OCC en sus convenciones predeterminadas. [ 7 ]
- El motor de base de datos GT.M utiliza OCC para gestionar las transacciones [ 8 ] (incluso las actualizaciones individuales se tratan como minitransacciones).
- Entity Framework de Microsoft (incluido Code-First) tiene soporte integrado para OCC basado en un valor de marca de tiempo binario. [ 9 ]
- La mayoría de los sistemas de control de versiones admiten el modelo de "fusión" para la concurrencia, que es OCC.
- Mimer SQL es un DBMS que solo implementa control de concurrencia optimista. [ 10 ]
- El almacén de datos de Google App Engine utiliza OCC. [ 11 ]
- El motor de búsqueda Apache Solr admite OCC a través del campo _version_ . [ 12 ]
- El motor de búsqueda Elasticsearch actualiza sus documentos mediante OCC. A cada versión de un documento se le asigna un número de secuencia, y las versiones más recientes reciben números de secuencia más altos. Dado que los cambios en un documento llegan de forma asíncrona, el software puede usar el número de secuencia para evitar sobrescribir una versión más reciente con una antigua. [ 13 ]
- CouchDB implementa OCC a través de revisiones de documentos. [ 14 ]
- El esquema de gestión de transacciones del sistema de gestión de bases de datos orientado a columnas MonetDB se basa en OCC. [ 15 ]
- La mayoría de las implementaciones de memoria transaccional de software utilizan OCC.
- Redis proporciona OCC a través del comando WATCH. [ 16 ]
- Firebird utiliza una arquitectura multigeneracional como implementación de OCC para la gestión de datos.
- DynamoDB utiliza la actualización condicional como una implementación de OCC. [ 17 ]
- Kubernetes utiliza OCC al actualizar recursos. [ 18 ]
- YugabyteDB es una base de datos nativa de la nube que utiliza principalmente OCC. [ 19 ]
- Firestore es una base de datos NoSQL de Firebase que utiliza OCC en sus transacciones.
- Apache Iceberg utiliza OCC para actualizar tablas y ejecutar operaciones de mantenimiento en ellas.
Véase también
Referencias
- ↑ Johnson, Rohit (2003). "Problemas comunes de acceso a datos" . Diseño y desarrollo J2EE personalizado para expertos . Wrox Press. ISBN 978-0-7645-4385-2Archivado del original el 8 de octubre de 2011.
- 1 2 H. T. Kung, JT Robinson (1981). "Sobre métodos optimistas para el control de concurrencia" (PDF) . ACM Transactions on Database Systems. Archivado (PDF) del original el 31 de agosto de 2019.
- ↑ "Editar la web: detectar el problema de la actualización perdida mediante el pago sin reservas" . Nota del W3C . 10 de mayo de 1999.
- ↑ Ayuda:Editar conflicto
- ↑ "Bugzilla: Preguntas frecuentes: Preguntas administrativas" . MozillaWiki . 11 de abril de 2012.
- ↑ "Módulo ActiveRecord::Locking" . Documentación del framework Rails .
- ↑ "Mapeo objeto-relacional (GORM)" . Documentación del framework Grails . Archivado del original el 15 de agosto de 2014.
- ↑ "Procesamiento de transacciones" . Guía del programador de GT.M, edición UNIX .
- ↑ "Gestión de conflictos de concurrencia" . Centro de documentación de Entity Framework . 5 de julio de 2023.
- ↑ "Concurrencia de transacciones - Control de concurrencia optimista" . Desarrolladores de Mimer - Características . Consultado el 22 de diciembre de 2023 .
- ↑ "The Datastore" . ¿Qué es Google App Engine? 27 de agosto de 2010.
- ↑ "Actualización de partes de documentos" . Consultado el 28 de junio de 2018 .
- ↑ "Control de concurrencia optimista" . Elastic . Consultado el 5 de febrero de 2024 .
- ↑ "Descripción general técnica" . Documentación de Apache CouchDB . Consultado el 6 de febrero de 2024 .
- ↑ "Transacciones - MonetDB" . 16 de enero de 2013.
- ↑ "Transacciones en Redis" .
- ↑ "Trabajar con elementos y atributos: escrituras condicionales" . Consultado el 2 de noviembre de 2020 .
- ↑ "Descripción general de la API - Operaciones de recursos" . Consultado el 3 de noviembre de 2020 .
- ↑ Yugabyte, Equipo. "Bloqueo explícito | Documentación de YugabyteDB" . docs.yugabyte.com . Archivado del original el 4 de enero de 2022. Consultado el 4 de enero de 2022 .
Enlaces externos
- Kung, HT; John T. Robinson (junio de 1981). "Sobre métodos optimistas para el control de concurrencia". ACM Transactions on Database Systems . 6 (2): 213– 226. CiteSeerX 10.1.1.101.8988 . doi : 10.1145/319566.319567 . S2CID 61600099 .
- Enterprise JavaBeans, 3.0, por Bill Burke y Richard Monson-Haefel, Capítulo 16. Transacciones, Sección 16.3.5. Bloqueo optimista, Editorial: O'Reilly, Fecha de publicación: 16 de mayo de 2006, ISBN impreso 0-596-00978-X,
- Hollmann, Andreas (mayo de 2009). "Multi-Isolation: Virtudes y limitaciones" (PDF) . Multi-Isolation (qué hay entre el bloqueo pesimista y el optimista) . 01069 Gutzkovstr. 30/F301.2, Dresde: Happy-Guys Software GbR. pág. 8. Consultado el 16 de mayo de 2013 .
{{cite conference}}: CS1 mantenimiento: ubicación ( enlace )
- Control de concurrencia
- Algoritmos de control de concurrencia
- Procesamiento de transacciones