Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So finden Sie gesperrte Zeilen in Oracle

Oracle Das Schließkonzept von ist ganz anders als bei den anderen Systemen.

Wenn eine Zeile in Oracle gesperrt wird, wird der Datensatz selbst mit dem neuen Wert (falls vorhanden) aktualisiert und zusätzlich wird eine Sperre (die im Wesentlichen ein Zeiger auf eine Transaktionssperre ist, die sich im Rollback-Segment befindet) direkt in den Datensatz gesetzt.

Das bedeutet, dass ein Datensatz in Oracle gesperrt wird bedeutet, die Metadaten des Datensatzes zu aktualisieren und einen logischen Seitenschreibvorgang auszugeben. Beispielsweise können Sie SELECT FOR UPDATE nicht ausführen auf einem schreibgeschützten Tablespace.

Darüber hinaus werden die Datensätze selbst nach dem Commit nicht aktualisiert:Stattdessen wird das Rollback-Segment aktualisiert.

Das bedeutet, dass jeder Datensatz einige Informationen über die Transaktion enthält, die ihn zuletzt aktualisiert hat, selbst wenn die Transaktion selbst schon lange tot ist. Um herauszufinden, ob die Transaktion aktiv ist oder nicht (und somit, ob der Datensatz aktiv ist oder nicht), muss das Rollback-Segment besucht werden.

Oracle hat keinen herkömmlichen Sperrenmanager, und das bedeutet, dass zum Abrufen einer Liste aller Sperren alle Datensätze in allen Objekten gescannt werden müssen. Das würde zu lange dauern.

Sie können einige spezielle Sperren erhalten, wie gesperrte Metadatenobjekte (mithilfe von v$locked_object ), Lock Waits (unter Verwendung von v$session ) usw., aber nicht die Liste aller Sperren für alle Objekte in der Datenbank.