Compartir a través de


Simultaneidad optimista

El nombre de la simultaneidad optimista viene 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 la hora en que la transacción actual la lee y la hora en que se actualiza o elimina. Es lo contrario a la simultaneidad pesimista, o bloqueo, en la que el desarrollador de aplicaciones cree que estas colisiones son comunes.

En la simultaneidad optimista, se deja desbloqueada una fila hasta que llega el momento de actualizarla o eliminarla. En ese momento, la fila se vuelve a leer y se comprueba si ha cambiado desde que se leyó por última vez. Si la fila ha cambiado, se produce un error de 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 de marca de tiempo 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 puede 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 niega el aumento de la simultaneidad que se consigue con la simultaneidad optimista.

Si el origen de datos implementa la simultaneidad 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 de la misma forma que lo haría con la simultaneidad pesimista; el controlador o el origen de datos devuelve SQLSTATE 01001 (Conflicto de operación de cursor) si se produce un error de 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, para actualizar o eliminar la fila, aumenta la simultaneidad a SQL_CONCUR_LOCK (para obtener acceso de escritura a la fila) y ejecuta 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, se producirá un error en la instrucción. 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.