“Conocimiento software>Software de base de datos

¿Qué medidas se pueden tomar para evitar el problema de actualización perdida en los sistemas de gestión de bases de datos?

2014/5/3
El problema de actualización perdida ocurre cuando dos o más transacciones leen los mismos datos, luego los actualican en función de sus respectivas lecturas. Si las transacciones no se sincronizan correctamente, las actualizaciones de una transacción pueden sobrescribir las actualizaciones de otra, lo que lleva a los datos perdidos. Aquí hay varias medidas que se pueden tomar para evitar esto:

1. Mecanismos de bloqueo:

* Locos exclusivos (bloqueos de escritura): Cuando una transacción quiere actualizar una fila, adquiere un bloqueo exclusivo en esa fila. Ninguna otra transacción puede adquirir ningún tipo de bloqueo (leer o escribir) en esa fila hasta que se lance el bloqueo exclusivo. Esto asegura que solo una transacción pueda modificar la fila en un momento dado.

* Bloqueos compartidos (lectura de lectura): Cuando una transacción quiere leer una fila, adquiere un bloqueo compartido en esa fila. Múltiples transacciones pueden contener bloqueos compartidos en la misma fila simultáneamente. Sin embargo, ninguna transacción puede adquirir un bloqueo exclusivo, mientras que hay bloqueos compartidos en esa fila. Esto evita que los escritores interfieran con los lectores.

* Granularidad de bloqueo: El nivel en el que se aplican los bloqueos (por ejemplo, nivel de fila, nivel de página, nivel de tabla, nivel de base de datos) afecta la concurrencia y el rendimiento. El bloqueo de grano más fino (por ejemplo, el nivel de fila) permite una mayor concurrencia, pero tiene una sobrecarga más alta, mientras que el bloqueo de grano más grueso (por ejemplo, el nivel de tabla) reduce la sobrecarga pero restringe la concurrencia.

2. Protocolos de control de concurrencia:

* Bloqueo de dos fases (2PL): Un protocolo de control de concurrencia que garantiza la capacidad de serial (y, por lo tanto, evita las actualizaciones perdidas). Tiene dos fases:

* Fase de crecimiento: Una transacción puede adquirir cerraduras pero no puede liberarlos.

* Fase de encogimiento: Una transacción puede lanzar bloqueos pero no puede adquirir otros nuevos.

El estricto bloqueo de dos fases (estricto 2PL) contiene todas las cerraduras exclusivas hasta el final de la transacción (confirmación o reversión). Esto evita que las reversiones en cascada (donde una falla de una transacción puede forzar la reversión de otros).

* ordenar la marca de tiempo (a): A cada transacción se le asigna una marca de tiempo única. El sistema utiliza estas marcas de tiempo para garantizar que las operaciones conflictivas se ejecuten en el orden de sus marcas de tiempo. Si una transacción intenta escribir un valor que ya ha sido sobrescribido por una transacción con una marca de tiempo posterior, la escritura se rechaza y la transacción se retira hacia atrás. Este enfoque evita los puntos muertos, pero puede conducir al hambre.

* Control de concurrencia optimista (OCC): Las transacciones proceden sin adquirir cerraduras. Antes de que se comprometa una transacción, verifica si alguna otra transacción ha modificado los datos que ha leído. Si hay conflictos, la transacción se retira hacia atrás. OCC es adecuado para situaciones con baja contención, ya que las reversiones pueden ser costosas. Normalmente tiene tres fases:

* lea fase: La transacción lee datos y los almacena en un espacio de trabajo local.

* Fase de validación: El sistema verifica si alguno de los datos de la lectura de la transacción ha sido modificado por otra transacción desde que se leyó.

* Fase de escritura: Si la validación es exitosa, los cambios se aplican a la base de datos. De lo contrario, la transacción se retira hacia atrás.

3. Usando transacciones:

* Propiedades ácidas: Siempre use transacciones y asegúrese de que su sistema de base de datos aplique las propiedades de ácido (atomicidad, consistencia, aislamiento, durabilidad). La propiedad de 'aislamiento' es crucial para prevenir actualizaciones perdidas.

* Niveles de aislamiento de transacciones: Las bases de datos SQL ofrecen diferentes niveles de aislamiento (por ejemplo, leen no comprometidos, leen lectura comprometida, repetible, serializable). Los niveles de aislamiento más altos (por ejemplo, serializables) proporcionan garantías más fuertes contra problemas de concurrencia como las actualizaciones perdidas, pero pueden reducir la concurrencia y el rendimiento. Elija cuidadosamente el nivel de aislamiento apropiado para las necesidades de su aplicación. 'Serializable` es el más restrictivo y más seguro, pero potencialmente más lento. `Read Committed` es un incumplimiento común y proporciona una protección razonable.

4. Lógica de nivel de aplicación:

* Operaciones atómicas (comparar y swap): Algunos sistemas de bases de datos y lenguajes de programación proporcionan operaciones atómicas que pueden usarse para realizar operaciones de lectura-modificación-escritura en un solo paso indivisible. Por ejemplo, la operación "Comparar y intercambiar" (CAS) puede actualizar atómicamente un valor si y solo si su valor actual coincide con un valor esperado especificado. Este enfoque puede evitar la necesidad de bloqueos explícitos en algunos casos.

* Registro de versiones/bloqueo optimista en la aplicación: La aplicación puede incluir un número de versión (o marca de tiempo) en los datos que lee. Al actualizar los datos, la aplicación incluye el número de versión original. La base de datos solo actualiza la fila si el número de versión coincide con el número de versión actual en la base de datos. Si los números de versión no coinciden, la actualización se rechaza y la aplicación debe volver a intentar la actualización. Esta es otra implementación de la estrategia optimista de control de concurrencia.

* Consideraciones lógicas comerciales: Revise la lógica comercial para ver si hay formas de evitar las operaciones de lectura-modificación-escritura por completo. ¿Puede rediseñar el modelo de datos o el proceso para evitar el potencial de actualizaciones perdidas?

5. Diseño de la base de datos:

* Normalización: Una base de datos correctamente normalizada ayuda a reducir la redundancia de datos y mejorar la consistencia de los datos, lo que puede ayudar indirectamente a prevenir problemas de concurrencia.

* Tipos de datos apropiados: El uso de tipos de datos apropiados para sus datos puede ayudar a prevenir errores y mejorar el rendimiento, lo que puede ayudar indirectamente a prevenir problemas de concurrencia.

Ejemplo de escenario y soluciones:

Imagine a dos usuarios que intentan actualizar la cantidad de un producto en una tabla de inventario.

* Usuario A: Lee la cantidad (por ejemplo, 10). El usuario A quiere vender 2, por lo que calcula la nueva cantidad como 8.

* Usuario B: Lee la cantidad (por ejemplo, 10). El usuario B quiere vender 3, por lo que calcula la nueva cantidad como 7.

* Usuario A: Escribe la nueva cantidad (8) a la base de datos.

* Usuario B: Escribe la nueva cantidad (7) a la base de datos.

La cantidad final en la base de datos es 7, pero debe ser 5 (10 - 2 - 3). La actualización del usuario A se perdió.

Aquí hay algunas soluciones para este escenario:

* LOQUEO EXCLUSIVO: Cuando cualquiera de los usuarios lea la cantidad para la actualización, adquiera un bloqueo exclusivo en la fila del producto. El otro usuario debe esperar hasta que se lance el bloqueo antes de leer y actualizar.

* Nivel de aislamiento serializable: Establezca el nivel de aislamiento de la transacción en serializable. Esto asegura que las dos transacciones sean serializadas de manera efectiva, evitando que interfieran entre sí.

* Bloqueo optimista (con número de versión):

1. Cuando el usuario A lee la cantidad (10), también leen un número de versión (por ejemplo, 1).

2. El usuario A calcula la nueva cantidad (8) e incluye el número de versión original (1) en la declaración de actualización.

3. La base de datos actualiza la cantidad solo si el número de versión actual sigue siendo 1. La declaración de actualización también incrementa el número de versión (por ejemplo, a 2).

4. Si el usuario B intenta actualizar después de que el usuario A ya se ha comprometido, la actualización del usuario B fallará (porque el número de versión ahora es 2) y tendrán que volver a leer los datos y volver a intentar la actualización.

* Operación de incremento atómico: Use una operación de incremento atómico/disminución atómica específica de la base de datos, si está disponible. Por ejemplo:`Actualizar el inventario de inventario Cantidad =Cantidad-2 donde Product_id =x` Este enfoque evita la secuencia de lectura-modificación-escritura.

Elegir el enfoque correcto:

El mejor enfoque para prevenir actualizaciones perdidas depende de varios factores, incluidos:

* Nivel de concurrencia: ¿Con qué frecuencia se realizan actualizaciones a los mismos datos?

* Requisitos de rendimiento: ¿Cuál es la sobrecarga aceptable para el control de la concurrencia?

* Capacidades del sistema de base de datos: ¿Qué mecanismos de control de concurrencia son compatibles con la base de datos?

* Complejidad de la aplicación: ¿Qué tan compleja es la lógica de la aplicación y qué tan fácil se puede modificar?

La consideración cuidadosa de estos factores lo ayudará a elegir la solución más efectiva para su situación específica. Usar una combinación de técnicas es a menudo la estrategia más efectiva. Por ejemplo, el uso de transacciones con un nivel de aislamiento apropiado junto con el bloqueo optimista en el nivel de aplicación.

Software de base de datos
Cómo consultar las propiedades extendidas en T -SQL
Cómo hacer referencia a las listas desplegables de cuadros de texto con Access 2007 Formularios
Cómo realizar consultas en Microsoft SQL
Cómo crear una Pfile
Cómo crear una base de datos con las etiquetas en un Mac
Ventajas y desventajas de las bases de datos de red
¿Cuántos tipos de bases de datos?
¿Qué programa administra el intercambio de datos?
Conocimiento de la computadora © http://www.ordenador.online