Oracle
 sql >> Database >  >> RDS >> Oracle

Come trovare le righe bloccate in Oracle

Oracle il concetto di blocco è molto diverso da quello degli altri sistemi.

Quando una riga in Oracle viene bloccato, il record stesso viene aggiornato con il nuovo valore (se presente) e, inoltre, viene inserito un blocco (che è essenzialmente un puntatore al blocco della transazione che risiede nel segmento di rollback).

Ciò significa che bloccare un record in Oracle significa aggiornare i metadati del record ed emettere una scrittura logica della pagina. Ad esempio, non puoi fare SELECT FOR UPDATE su un tablespace di sola lettura.

Inoltre, i record stessi non vengono aggiornati dopo il commit:viene invece aggiornato il segmento di rollback.

Ciò significa che ogni record contiene alcune informazioni sull'ultima transazione che lo ha aggiornato, anche se la transazione stessa è morta da tempo. Per scoprire se la transazione è attiva o meno (e, quindi, se il record è attivo o meno), è necessario visitare il segmento di rollback.

Oracle non dispone di un gestore di blocchi tradizionale e ciò significa che per ottenere un elenco di tutti i blocchi è necessario eseguire la scansione di tutti i record in tutti gli oggetti. Ci vorrebbe troppo tempo.

Puoi ottenere alcuni blocchi speciali, come oggetti di metadati bloccati (usando v$locked_object ), il blocco attende (usando v$session ) ecc, ma non l'elenco di tutti i blocchi su tutti gli oggetti nel database.