Está en la página 1de 6

Estado de bloqueo: Los usuarios slo pueden acceder a las cuentas desbloqueadas.

BLOQUEOS
Los bloqueos evitan que varias sesiones cambien los mismos datos al mismo tiempo.
Se obtienen automticamente en el nivel ms bajo posible para una sentencia determinada.
No escalan.

Bloqueos
Para que la base de datos permita que una sesin modifique datos, la sesin debe bloquear
primero los datos que se van a modificar. Un bloqueo ofrece a la sesin el control exclusivo
sobre los datos, para que ninguna otra transaccin pueda modificar los datos bloqueados hasta
que se libera el bloqueo.
Las transacciones pueden bloquear filas individuales de datos, varias filas o incluso tablas
completas. La base de datos Oracle 10g soporta tanto bloqueo manual como el automtico.
Los bloqueos adquiridos automticamente eligen siempre el nivel de bloqueo ms bajo posible
para minimizar posibles conflictos con otras transacciones.
Mecanismo de Bloqueo
Alto nivel de simultaneidad de datos:
Bloqueos de nivel de fila para inserciones,
actualizaciones y supresiones
No se necesita ningn bloqueo en las consultas
Gestin automtica de la cola
Bloqueos retenidos hasta que finaliza la transaccin
(con la operacin COMMIT o ROLLBACK)

Mecanismo de Bloqueo
El mecanismo de bloqueo est diseado para proporcionar el mximo grado posible de
simultaneidad de datos en la base de datos. Las transacciones que modifican datos adquieren
bloqueos de nivel de fila en lugar de bloqueos de nivel de tabla o de bloque. Las modificaciones
de objetos (como movimientos de tabla) obtienen bloqueos de nivel de objeto en lugar de
bloqueos de todo el esquema o base de datos.
Las consultas de datos no necesitan ningn bloqueo y una consulta se realiza correctamente
aunque los datos estn bloqueados (mostrando siempre el original, el valor previo al bloqueo
reconstruido a partir de informacin de deshacer).
Cuando varias transacciones necesitan bloquear el mismo recurso, la primera transaccin que
solicita el bloqueo lo obtiene. Las dems transacciones esperan hasta que termina la primera
transaccin. El mecanismo de cola es automtico y no necesita la interaccin del administrador.
Todos los bloqueos se liberan al final de una transaccin. Las transacciones se completan cuando
se emite un comando COMMITo ROLLBACK. En caso de una transaccin fallida, el mismo
proceso en segundo plano que automticamente realiza un rollback de los cambios de la
transaccin fallida libera todos los bloqueos retenidos por esa transaccin.

Simultaneidad de Datos
El mecanismo de bloqueo es por defecto un modo de bloqueo
detallado de nivel de fila. Distintas
transacciones pueden estar actualizando diferentes filas dentro
de la misma tabla sin interferir las
unas en las otras.
Aunque el modelo por defecto es el bloqueo en el nivel de fila,
la base de datos Oracle soporta el
bloqueo manual en niveles superiores si es necesario:
SQL> LOCK TABLE employees IN EXCLUSIVE MODE;
Table(s) Locked.
Con la sentencia anterior, cualquier otra transaccin que intente
actualizar una fila de la tabla
bloqueada debe esperar hasta que termine la transaccin que emiti la solicitud de bloqueo.
EXCLUSIVE es el modo de bloqueo ms absoluto. Los otros modos de bloqueo son los
siguientes:
ROW SHARE: Permite el acceso simultneo a la tabla bloqueada, pero prohbe que las
sesiones bloqueen toda la tabla para un acceso exclusivo.
ROW EXCLUSIVE: Igual que ROW SHARE, pero tambin prohbe el bloqueo en el modo
SHARE. Los bloqueos ROW EXCLUSIVE se obtienen automticamente al actualizar,
insertar o suprimir datos.
Simultaneidad de Datos (continuacin)
SHARE: Permite consultas simultneas, pero prohbe actualizaciones en la tabla bloqueada.
Es necesario un bloqueo SHARE(y se solicita automticamente) para crear un ndice en
una tabla.
SHAREROWEXCLUSIVE: Se utiliza para consultar una tabla completa y permitir que
otros consulten filas de la misma, pero prohbe que los dems bloqueen la tabla en modo
SHAREo actualicen filas.
EXCLUSIVE: Permite realizar consultas de la tabla bloqueada pero prohbe las dems
actividades en ella. Es necesario un bloqueo EXCLUSIVEpara borrar una tabla.
Como cualquier solicitud de bloqueo, las sentencias de bloqueo manual esperan hasta que todas
las sesiones que ya tienen bloqueos o que los han solicitado con anterioridad liberen sus
bloqueos. El comando LOCKacepta un argumento especial que controla el comportamiento de
espera, NOWAIT.
NOWAITdevuelve el control inmediatamente si la tabla especificada ya est bloqueada por otra
sesin:
SQL>LOCKTABLEhr.employeesINSHAREMODENOWAIT;
LOCKTABLEhr.employeesINSHAREMODENOWAIT
*
ERRORatline1:
ORA00054:resourcebusyandacquirewithNOWAITspecified

Normalmente no es necesario bloquear manualmente los objetos. El mecanismo de bloqueo


automtico proporciona la simultaneidad de datos necesaria para la mayora de las aplicaciones.

Bloqueos de DML
Transaccin 1
SQL> UPDATE employees
2 SET salary=salary*1.1
3 WHERE employee_id= 106;
1 row updated.
SQL> UPDATE employees
2 SET salary=salary*1.1
3 WHERE employee_id= 107;
1 row updated.

Transaccin 2
Las transacciones de DML deben adquirir dos bloqueos:
Bloqueo EXCLUSIVE de fila para la fila o filas que se
van a actualizar
Bloqueo de nivel de tabla ROW EXCLUSIVE para la
tabla que contiene las filas
Bloqueos de DML
Las transacciones de DML obtienen dos bloqueos:
Bloqueo EXCLUSIVEde fila para la fila o filas que se van a actualizar.
Bloqueo de nivel de tabla ROWEXCLUSIVEen la tabla que se va a actualizar. Sirve para
evitar que otra sesin bloquee la tabla completa (posiblemente para borrarla o truncarla)
mientras se realiza el cambio.

Mecanismo de Puesta en Cola


El mecanismo de puesta en cola realiza el seguimiento
de lo siguiente:
Sesiones en espera de bloqueos
Modo de bloqueo solicitado
Orden en el que las sesiones solicitaron el bloqueo

Mecanismo de Puesta en Cola


Las solicitudes de bloqueos se ponen en cola automticamente. En cuanto termina la transaccin
que retiene un bloqueo, la siguiente sesin de la cola recibe el bloqueo.
El mecanismo de puesta en cola realiza el seguimiento del orden en el que se han solicitado los
bloqueos y el modo de bloqueo solicitado.
Las sesiones que ya retienen un bloqueo pueden solicitar convertir dicho bloqueo sin tener que ir
al final de la cola. Por ejemplo, si una sesin retiene un bloqueo SHAREen una tabla, la sesin
puede solicitar convertir el bloqueo SHAREen un bloqueo EXCLUSIVE. Siempre que nadie ms
tenga ya un bloqueo EXCLUSIVEo SHAREde la tabla, se otorgar un bloqueo SHAREa la
sesin que retiene el bloqueo EXCLUSIVEsin tener que volver a esperar en la cola.

CONFLICTOS DE BLOQUEO
Conflictos de Bloqueo
Los conflictos de bloqueo se producen con
frecuencia, pero normalmente se resuelven
con el
tiempo y el mecanismo de cola. En algunos
casos excepcionales, puede que sea necesaria
la
intervencin del administrador en un
conflicto de bloqueo. En el caso de la
diapositiva, la
transaccin 2 obtiene un bloqueo de una
nica fila a las 9:00:00 y no se realiza la
confirmacin,
dejando el bloqueo en su lugar. La transaccin 1 intenta actualizar toda la tabla a las 9:00:05, lo
que necesita un bloqueo de todas las filas. La transaccin 2 bloquea la transaccin 1 hasta que la
transaccin 2 realiza la confirmacin a las 16:30:01.
El usuario que intenta realizar la transaccin 1 se pondra en contacto casi con toda probabilidad
con el administrador para solicitar ayuda en este caso, y el DBA debera detectar y resolver el
conflicto.

Posibles Causas de Conflictos de Bloqueo


Cambios sin confirmar
Transacciones con una ejecucin muy larga
Niveles altos de bloqueo innecesarios
Posibles Causas de Conflictos de Bloqueo
La causa ms comn de conflictos de bloqueo es un cambio sin confirmar, aunque existen
algunas otras causas posibles:
Transacciones con una ejecucin muy larga: Muchas aplicaciones utilizan el
procesamiento por lotes para realizar actualizaciones en bloque. Estos trabajos por lotes
normalmente se planifican para momentos de baja o ninguna actividad de los usuarios,
pero puede que en algunos casos no hayan terminado o tarden demasiado en ejecutarse
durante el perodo de baja actividad. Los conflictos de bloqueo son comunes cuando la
transaccin y el procesamiento por lotes se estn realizando simultneamente.
Niveles altos de bloqueo innecesarios: No todas las bases de datos soportan el bloqueo de
nivel de fila (Oracle introdujo el soporte para los bloqueos de nivel de fila en 1988 con la
versin 6). Algunas bases de datos an realizan bloqueos en el nivel de tabla o de pgina.
Los desarrolladores que escriben aplicaciones destinadas a ejecutarse en muchas bases de
datos diferentes suelen escribir sus aplicaciones con niveles de bloqueo artificialmente
altos para que la base de datos Oracle se comporte de manera similar a aquellos sistemas
de base de datos con menos posibilidades. Adems, los desarrolladores nuevos en Oracle
a veces codifican innecesariamente en niveles de bloqueo ms altos de los que necesita la
base de datos Oracle.

Deteccin de Conflictos de Bloqueo


Seleccione Blocking Sessions en la pgina Performance.

Haga clic en el enlace Session ID para ver informacin


sobre la sesin bloqueante, que incluye la sentencia
SQL real.
Deteccin de Conflictos de Bloqueo
Utilice la pgina Blocking Sessions de Enterprise Manager para localizar conflictos de bloqueo.
Las solicitudes de bloqueo en conflicto se muestran con un diseo jerrquico en el que la sesin
que retiene el bloqueo se sita en la parte superior, seguidas de todas las sesiones que estn en
cola para el bloqueo.
Para cada sesin implicada en el conflicto se proporciona el nombre de usuario, el identificador
de sesin y el nmero de segundos que la sesin ha estado en espera. Acceda al identificador de
sesin para ver las sentencias SQL reales ejecutadas o solicitadas por la sesin en ese momento.
El monitor de diagnstico de base de datos automtico (ADDM) tambin detecta de manera
automtica los conflictos de bloqueo y puede avisarle de las tendencias de bloqueo ineficaces

Resolucin de Conflictos de Bloqueo


Para resolver un conflicto de bloqueo:
Haga que la sesin que retiene el bloqueo realice
una confirmacin o un rollback
Termine la sesin que retiene el bloqueo como
ltimo recurso

Resolucin de Conflictos de Bloqueo


Para resolver un conflicto de bloqueo, la sesin que retiene el bloqueo debe liberarlo. El mejor
modo de que la sesin libere el bloqueo es ponerse en contacto con el usuario y pedir que
termine la transaccin.
En caso de emergencia, el administrador puede terminar la sesin que retiene el bloqueo
haciendo clic en el botn Kill Session. Recuerde que cuando se mata una sesin todo el trabajo
de la transaccin actual se pierde (se realiza un rollback). Un usuario cuya sesin se ha matado
debe volver a conectarse y rehacer todo el trabajo desde la ltima confirmacin de la sesin
matada.
Los usuarios cuyas sesiones se han matado recibirn el siguiente error la siguiente vez que
intenten emitir una sentencia SQL:
ORA03135:connectionlostcontact

Resolucin de Conflictos de Bloqueo mediante SQL


La manipulacin de sesiones, al igual que la mayora del
resto de tareas realizadas en Enterprise
Manager, tambin se puede realizar mediante la emisin de
sentencias SQL. La tabla
v$session contiene detalles de todas las sesiones
conectadas. blocking_session es el
identificador de sesin de la sesin que se est bloqueando.
De esta forma, si consulta el valor
de SID y SERIAL#, donde SID se corresponde con un
identificador de sesin de bloqueo,
dispondr de la informacin necesaria para realizar la operacin kill sesin

Interbloqueos
Interbloqueos
Un interbloqueo es un ejemplo especial de conflicto de bloqueo. Los
interbloqueos surgen
cuando dos o ms sesiones esperan los datos que bloquean entre
ellas. Puesto que cada una
est esperando a la otra, ninguna puede terminar la transaccin para
resolver el conflicto.
La base de datos Oracle detecta automticamente los interbloqueos y termina la sentencia con un
error. La respuesta adecuada a ese error es una accin de confirmacin o de rollback, que libera
cualquier otro bloqueo de esa sesin para que la otra sesin pueda continuar con su transaccin.
En el ejemplo de la diapositiva, la transaccin 1 debe realizar una confirmacin o un rollback
como respuesta al error detectado de interbloqueo. Si realiza una confirmacin, necesitar
volver a enviar la segunda actualizacin para terminar su transaccin. Si realiza un rollback,
debe volver a enviar ambas sentencias para terminar su transaccin.