Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como encontrar linhas bloqueadas no Oracle


Oracle O conceito de travamento do 's é bem diferente do dos outros sistemas.

Quando uma linha no Oracle fica bloqueado, o próprio registro é atualizado com o novo valor (se houver) e, além disso, um bloqueio (que é essencialmente um ponteiro para o bloqueio de transação que reside no segmento de rollback) é colocado diretamente no registro.

Isso significa que bloquear um registro no Oracle significa atualizar os metadados do registro e emitir uma gravação de página lógica. Por exemplo, você não pode fazer SELECT FOR UPDATE em um tablespace somente leitura.

Mais do que isso, os próprios registros não são atualizados após o commit:em vez disso, o segmento de rollback é atualizado.

Isso significa que cada registro contém algumas informações sobre a última transação que o atualizou, mesmo que a própria transação tenha morrido há muito tempo. Para saber se a transação está ativa ou não (e, portanto, se o registro está ativo ou não), é necessário visitar o segmento de rollback.

O Oracle não possui um gerenciador de bloqueios tradicional, e isso significa que obter uma lista de todos os bloqueios requer a verificação de todos os registros em todos os objetos. Isso levaria muito tempo.

Você pode obter alguns bloqueios especiais, como objetos de metadados bloqueados (usando v$locked_object ), esperas de bloqueio (usando v$session ) etc, mas não a lista de todos os bloqueios em todos os objetos no banco de dados.