Transcripción Tipos de bloqueos en Oracle DBA: definición y ejemplos
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 c
objetos bloqueos