El control de concurrencia optimista ( OCC ) es un método de control de concurrencia aplicado a sistemas transaccionales como los sistemas de administración de bases de datos relacionales y la memoria transaccional de software . OCC asume que con frecuencia se pueden completar múltiples transacciones sin interferir entre sí. Mientras se ejecutan, las transacciones usan recursos de datos sin adquirir bloqueos en esos recursos. Antes de comprometerse, cada transacción verifica que ninguna otra transacción haya modificado los datos que ha leído. Si la comprobación revela modificaciones conflictivas, la transacción de confirmación se revierte y se puede reiniciar. [1] El control de concurrencia optimista fue propuesto por primera vez por HT Kung y John T. Robinson.[2]
OCC se utiliza generalmente en entornos con poca contención de datos . Cuando los conflictos son poco frecuentes, las transacciones pueden completarse sin el gasto de administrar bloqueos y sin que las transacciones esperen a que se borren los bloqueos de otras transacciones, lo que genera un rendimiento más alto que otros métodos de control de concurrencia. Sin embargo, si la disputa por los recursos de datos es frecuente, el costo de reiniciar las transacciones repetidamente perjudica significativamente el rendimiento, en cuyo caso otros métodos de control de concurrencia pueden ser más adecuados. Sin embargo, los métodos basados en bloqueo ("pesimistas") también pueden ofrecer un rendimiento deficiente porque 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 simultaneidad optimistas involucran estas fases: [2]
- Comenzar : registre una marca de tiempo que marque el comienzo de la transacción.
- Modificar : lee los valores de la base de datos y escribe cambios de forma provisional.
- Validar : Verifique si otras transacciones tienen datos modificados que esta transacción ha utilizado (leídos o escritos). 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.
- Confirmar / Revertir : si no hay conflicto, haga que todos los cambios surtan efecto. Si hay un conflicto, resuélvalo, normalmente abortando la transacción, aunque son posibles otros esquemas de resolución. Se debe tener cuidado para evitar un error de tiempo de verificación a tiempo de uso , particularmente si esta fase y la anterior no se realizan como una sola operación atómica .
Uso de la web
La naturaleza sin estado de HTTP hace que el bloqueo no sea factible para las interfaces de usuario web. Es común que un usuario comience a editar un registro y luego se vaya sin seguir el enlace "cancelar" o "cerrar sesión". Si se usa el bloqueo, otros usuarios que intenten editar el mismo registro deben esperar hasta que se agote el tiempo de bloqueo del primer usuario.
HTTP proporciona una forma de OCC integrado. La respuesta a una solicitud GET inicial puede incluir una ETag para que las solicitudes PUT posteriores se utilicen en el encabezado If-Match. Cualquier solicitud PUT con un ETag desactualizado en el encabezado If-Match puede rechazarse. [3]
Algunos sistemas de administración de bases de datos ofrecen OCC de forma nativa, sin requerir un código de aplicación especial. Para otros, la aplicación puede implementar una capa OCC fuera de la base de datos y evitar esperar o sobrescribir registros silenciosamente. En tales 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 enviarlo, esto se compara con la base de datos. Si difiere, se invoca el algoritmo de resolución de conflictos.
Ejemplos de
- Las páginas de edición de MediaWiki utilizan OCC. [4]
- Bugzilla usa OCC; los conflictos de edición se denominan "colisiones en el aire". [5]
- El marco de Ruby on Rails tiene una API para OCC. [6]
- El marco de Grails usa OCC en sus convenciones predeterminadas. [7]
- El motor de base de datos GT.M utiliza OCC para gestionar transacciones [8] (incluso las actualizaciones únicas se tratan como minitransacciones).
- Microsoft 's marco de la entidad (incluyendo Código-Primera) se ha incorporado en el apoyo a la OCC sobre la base de un valor de marca de tiempo binario. [9]
- Mimer SQL es un DBMS que solo implementa un 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 admite OCC a través del atributo de versión. [13]
- CouchDB implementa OCC mediante 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. [ cita requerida ]
- Redis proporciona OCC a través del comando WATCH. [dieciséis]
- MySQL implementa OCC en la configuración de replicación de grupo. [ cita requerida ]
- Firebird utiliza una arquitectura multigeneracional como implementación de OCC para la gestión de datos. [ cita requerida ]
- DynamoDB usa la actualización condicional como implementación de OCC. [17]
- Kubernetes usa OCC al actualizar recursos. [18]
Ver también
- Bloque de mensajes del servidor # Bloqueo oportunista
Referencias
- ^ Johnson, Rohit (2003). "Problemas comunes de acceso a datos" . Diseño y desarrollo J2EE uno a uno experto . Prensa Wrox. ISBN 978-0-7645-4385-2. Archivado desde el original el 8 de octubre de 2011.
- ^ a b HT Kung, JT Robinson (1981). "Sobre métodos optimistas para el control de la concurrencia" (PDF) . Transacciones ACM en sistemas de bases de datos.
- ^ "Edición de la Web: detección del problema de actualización perdida mediante el pago sin reservas" . Nota del W3C . 10 de mayo de 1999.
- ^ Ayuda: Editar conflicto
- ^ "Bugzilla: FAQ: preguntas administrativas" . MozillaWiki . 11 de abril de 2012.
- ^ "Módulo ActiveRecord :: Bloqueo" . Documentación de Rails Framework .
- ^ "Mapeo relacional de objetos (GORM)" . Documentación del marco de Grails . Archivado desde el original el 15 de agosto de 2014.
- ^ "Procesamiento de transacciones" . Guía de programadores GT.M Edición UNIX .
- ^ "Consejo 19 - Cómo utilizar la concurrencia optimista con Entity Framework" . Blogs de MSDN . 19 de mayo de 2009.
- La mayoría de los sistemas de control de revisiones admiten el modelo de "fusión" para la concurrencia, que es OCC.
- ^ "Simultaneidad de transacción - Control de simultaneidad optimista" . Desarrolladores de Mimer - Características . 26 de febrero de 2010. Archivado desde el original el 21 de marzo de 2013 . Consultado el 6 de mayo de 2013 .
- ^ "El almacén de datos" . ¿Qué es Google App Engine? . 27 de agosto de 2010.
- ^ "Actualización de partes de documentos" . Consultado el 28 de junio de 2018 .
- ^ "Elasticsearch - Guía - Índice API" . Guía de Elasticsearch . 22 de marzo de 2012.
- ^ "Wiki de Couchdb - Document_revisions" . Archivado desde el original el 4 de febrero de 2017.
- ^ "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 .
enlaces externos
- Kung, HT; John T. Robinson (junio de 1981). "Sobre métodos optimistas para el control de la concurrencia". Transacciones ACM en sistemas de bases de datos . 6 (2): 213–226. CiteSeerX 10.1.1.101.8988 . doi : 10.1145 / 319566.319567 .
- Enterprise JavaBeans, 3.0, por Bill Burke, Richard Monson-Haefel, Capítulo 16. Transacciones, Sección 16.3.5. Bloqueo optimista, editor: O'Reilly, fecha de publicación: 16 de mayo de 2006, impresión ISBN 0-596-00978-X ,
- Hollmann, Andreas (mayo de 2009). "Aislamiento múltiple: virtudes y limitaciones" ( PDF ) . Aislamiento múltiple (qué hay entre el bloqueo pesimista y optimista) . 01069 Gutzkovstr. 30 / F301.2, Dresde: Happy-Guys Software GbR. pag. 8 . Consultado el 16 de mayo de 2013 .Mantenimiento de CS1: ubicación ( enlace )[ enlace muerto permanente ]