sql >> Base de Datos >  >> RDS >> Oracle

Cómo encontrar filas bloqueadas en Oracle

Oracle El concepto de bloqueo de es bastante diferente al de los otros sistemas.

Cuando una fila en Oracle se bloquea, el registro en sí se actualiza con el nuevo valor (si lo hay) y, además, se coloca un bloqueo (que es esencialmente un puntero al bloqueo de transacción que reside en el segmento de reversión) directamente en el registro.

Esto significa que bloquear un registro en Oracle significa actualizar los metadatos del registro y emitir una escritura de página lógica. Por ejemplo, no puede hacer SELECT FOR UPDATE en un tablespace de solo lectura.

Más que eso, los registros en sí no se actualizan después de la confirmación:en su lugar, se actualiza el segmento de reversión.

Esto significa que cada registro contiene información sobre la transacción que lo actualizó por última vez, incluso si la transacción en sí ha muerto hace mucho tiempo. Para averiguar si la transacción está viva o no (y, por lo tanto, si el registro está vivo o no), es necesario visitar el segmento de reversión.

Oracle no tiene un administrador de bloqueos tradicional, y esto significa que obtener una lista de todos los bloqueos requiere escanear todos los registros en todos los objetos. Esto llevaría demasiado tiempo.

Puede obtener algunos bloqueos especiales, como objetos de metadatos bloqueados (utilizando v$locked_object ), bloquear esperas (usando v$session ), etc., pero no la lista de todos los bloqueos en todos los objetos de la base de datos.