Ir al contenido principal

SELECT FOR UPDATE

Una ultima sentencia de control de transacciones es SELECT FOR UPDATE. Oracle, por defecto, ofrece el más alto nivel de concurrencia: las lecturas no bloquean a las escrituras y los escrituras no bloquean a las lecturas. O, en lenguaje claro, no hay problema con una sesión de consulta de datos con otra sesión que está actualizando, o una sesión de actualización de datos con otra sesión está consultando. Sin embargo, hay ocasiones en que es posible que desee cambiar este comportamiento y evitar cambios en los datos que se está consultando. No es usual para una aplicacion recuperar un conjunto de filas con un comando SELECT.
presentarlos a un usuario , y lo pedirá sin ningún cambio. Debido a que Oracle es una base de datos multiusuario, no es imposible que otra sesión  también ha recuperado las mismas filas. Si las dos sesiones tratan de hacer cambios, puede haber algunos efectos bastante extraño. La siguiente tabla muestra tal situación.


Esto es un poco desconcertante. Una forma de evitar este problema es cerrar las filas en las que se está interesado:

select * from regions for update;

La cláusula FOR UPDATE coloca un candado en todas las filas recuperadas.No se pueden hacer cambios a ellos por una sesión distinta de la que dio la orden, y por lo tanto las actualizaciones subsiguientes tendrán éxito: no es posible para las filas que se han cambiado. Esto significa que una sola sesión tendrá una visión coherente de los datos, pero el precio a pagar es que otras sesiones se cuelgue si tratan de actualizar alguna de las filas bloqueadas.Los bloqueos que haya introducido una cláusula FOR UPDATE se llevará a cabo hasta que la sesión emita un COMMIT o ROLLBACK. Esto debe hacerse para liberar los bloqueos, incluso si no hay ningún comando DML se han ejecutado.

Comentarios