Tipos de bloqueos
Cuando se trabaja con Base de Datos es normal que varios usuarios accedan a la vez a una misma tabla e incluso a un mismo registro. Para evitar errores, Oracle tiene un control de los posibles accesos concurrentes a los datos, realizando bloqueos en las tablas y registros.
Cuando una sesión actualiza una fila, Oracle bloque esta fila. La fila solo es bloqueada para impedir a otra sesión actualizarla, por lo que permite leerla. Estos bloqueos permanecen hasta que la transacción finalice con un COMMIT o un ROLLBACK.
TIPOS DE BLOQUEOS:
Bloqueo exclusivo:
- Este es el nivel estándar de bloqueo y se realiza a nivel de registro.
- A otras sesiones se les permite la consulta de los datos de los registros bloqueados pero no permite su actualización.
- Este bloqueo se mantiene hasta que la sesión que provoca el bloqueo realiza un COMMIT (para confirmar los cambios) o ROLLBACK( para deshacer los cambios).
Bloqueo compartido:
- Este bloqueo se realiza a nivel de tabla, aunque solo acceda a un registro se bloquea toda la tabla.
- Permite que otras sesiones realicen este mismo bloqueo, pero no permite bloqueos exclusivos.
- Permite la recuperación de datos, pero no modificarlos.
Bloqueos/abrazos mortales: Algunas veces ocurre que dos sesiones se bloquean mutuamente al intentar acceder a un objeto. Oracle resuelve este problema:
- Realizando un ROLLBACK sobre una sesión y retornándole el error «ORA00060 Deadlock detected».
- A la otra sesión le permite continuar.
Mecanismo de encolado o ENQUEUE: Con este mecanismo Oracle encola las peticiones de bloqueo exclusivo, garantizando el orden de petición del acceso al objeto. Una sentencia SELECT normal siempre tendrá éxito, porque la SELECT no realiza ningún bloqueo, pero una declaración DML colgara.
La sentencia SELECT … FOR UPDATE, esta sentencia no actualiza pero provoca un bloqueo exclusivo sobre las filas para que después se pueda realizar operaciones DML sin problemas de bloqueos, y si en las filas ya existiese un bloqueo, la sentencia quedaria en cola hasta que las filas se desbloqueen y serán bloqueadas por esta sentencia.
Para evitar que la sentencia SELECT … FOR UPDATE se quede en cola, se puede usar 2 cláusulas:
- SELECT … FOR UPDATE NOWAIT
- SELECT … FOR UPDATE WAIT
Una vez obtenido el bloqueo sobre las filas deseadas con el comando SELECT … FOR UPDATE, ya se puede ejecutar las sentencias DML sin la posibilidad de que las filas estén bloqueadas por otra sesión.
Todas las declaraciones DML requieren al menos dos bloqueos:
- Un bloqueo exclusivo en cada fila afectada.
- Un bloqueo compartido en la tabla que contiene la fila.
El bloqueo exclusivo impide a otra sesión interferir con la fila y el bloqueo compartido impide a otra sesión cambiar la definición de tabla con una declaración DDL. Estos bloqueos son solicitadas automáticamente. Si una declaración DML no puede conseguir el bloqueo de fila exclusiva, entonces la sesión colgara hasta que lo consiga.
Los comandos DDL requieren un bloqueo exclusivo en el objeto referido. Y solo podrá ser posible cuando hayan terminado todas las transacciónes DML de la tabla. Este bloqueo es solicitada automáticamente, pero si no puede ser porque otra sesión ya tiene una cerradura compartida para un DML, entonces la declaración se terminara con un error inmediatamente.
Deadlockse
Esto sucede cuando dos sesiones se bloquean mutuamente para acceder a una fila. Está causado por el mal diseño de programas y la base de datos lo soluciona automáticamente. La información respecto a puntos muertos es escrita en el ALER LOG.
Para eliminar manualmente una sesión se puede usar la siguiente sentencia:
- ALTER SYSTEM KILL SESSION ‘PID" [IMMEDIATE]
- Este es el nivel estándar de bloqueo y se realiza a nivel de registro.
- A otras sesiones se les permite la consulta de los datos de los registros bloqueados pero no permite su actualización.
- Este bloqueo se mantiene hasta que la sesión que provoca el bloqueo realiza un COMMIT (para confirmar los cambios) o ROLLBACK( para deshacer los cambios).
Bloqueo compartido:
- Este bloqueo se realiza a nivel de tabla, aunque solo acceda a un registro se bloquea toda la tabla.
- Permite que otras sesiones realicen este mismo bloqueo, pero no permite bloqueos exclusivos.
- Permite la recuperación de datos, pero no modificarlos.
Bloqueos/abrazos mortales: Algunas veces ocurre que dos sesiones se bloquean mutuamente al intentar acceder a un objeto. Oracle resuelve este problema:
- Realizando un ROLLBACK sobre una sesión y retornándole el error «ORA00060 Deadlock detected».
- A la otra sesión le permite continuar.
Mecanismo de encolado o ENQUEUE: Con este mecanismo Oracle encola las peticiones de bloqueo exclusivo, garantizando el orden de petición del acceso al objeto. Una sentencia SELECT normal siempre tendrá éxito, porque la SELECT no realiza ningún bloqueo, pero una declaración DML colgara.
La sentencia SELECT … FOR UPDATE, esta sentencia no actualiza pero provoca un bloqueo exclusivo sobre las filas para que después se pueda realizar operaciones DML sin problemas
objetos bloqueos