Compartir a través de


Simultaneidad optimista

La simultaneidad optimista deriva su nombre de la suposición optimista de que rara vez se producirán colisiones entre transacciones; se dice que se ha producido una colisión cuando otra transacción actualiza o elimina una fila de datos entre el momento en que la transacción actual lee y la hora en que se actualiza o elimina. Es lo contrario de la simultaneidad pesimista, o bloqueo, donde el desarrollador de aplicaciones considera que tales colisiones son habituales.

En la simultaneidad optimista, se deja desbloqueada una fila hasta que llegue el momento de actualizarla o eliminarla. En ese momento, la fila se vuelve a leer y comprueba si se ha cambiado desde que se leyó por última vez. Si la fila ha cambiado, se produce un error en la actualización o eliminación y se debe volver a intentar.

Para determinar si se ha cambiado una fila, su nueva versión se comprueba con una versión almacenada en caché de la fila. Esta comprobación se puede basar en la versión de fila, como la columna timestamp de SQL Server o los valores de cada columna de la fila. Muchos DBMS no admiten versiones de fila.

El origen de datos o la aplicación pueden implementar la simultaneidad optimista. En cualquier caso, la aplicación debe usar un nivel de aislamiento de transacción bajo, como "Read Committed"; el uso de un nivel superior anula el aumento de la simultaneidad obtenida mediante la simultaneidad optimista.

Si el origen de datos implementa la concurrencia optimista, la aplicación establece el atributo de instrucción SQL_ATTR_CONCURRENCY en SQL_CONCUR_ROWVER o SQL_CONCUR_VALUES. Para actualizar o eliminar una fila, ejecuta una instrucción de actualización o eliminación posicionada o llama a SQLSetPos igual que lo haría con simultaneidad pesimista; El controlador o el origen de datos devuelve SQLSTATE 01001 (conflicto de operación de cursor) si se produce un error en la actualización o eliminación debido a una colisión.

Si la propia aplicación implementa la simultaneidad optimista, establece el atributo de instrucción SQL_ATTR_CONCURRENCY en SQL_CONCUR_READ_ONLY para leer una fila. Si va a comparar las versiones de fila y no conoce la columna de versión de fila, llama a SQLSpecialColumns con la opción SQL_ROWVER para determinar el nombre de esta columna.

La aplicación actualiza o elimina la fila aumentando la simultaneidad a SQL_CONCUR_LOCK (para obtener acceso de escritura a la fila) y ejecutando una instrucción UPDATE o DELETE con una cláusula WHERE que especifica la versión o los valores que tenía la fila cuando la aplicación la leyó. Si la fila ha cambiado desde entonces, la instrucción fallará. Si la cláusula WHERE no identifica de forma única la fila, la instrucción también puede actualizar o eliminar otras filas; las versiones de fila siempre identifican filas de forma única, pero los valores de fila identifican de forma única las filas solo si incluyen la clave principal.