Sie können nicht wirklich alle Zeilen auflisten, die von einer Sitzung gesperrt werden. Sobald jedoch eine Sitzung von einer anderen blockiert wird, können Sie feststellen, welche Sitzung / Zeile sie blockiert.
Oracle führt keine Liste einzelner Zeilensperren. Sperren werden vielmehr direkt in den Zeilen selbst registriert - stellen Sie sich das als zusätzliche Spalte vor.
Sie können über die V$LOCK
Ansicht herausfinden, welche Sitzung eine Sperre für ein Objekt erhalten hat. Dabei werden jedoch nur allgemeine Informationen aufgelistet, nicht auf Zeilenebene.
In dieser Ansicht können Sie auch feststellen, ob eine Sitzung von einer anderen blockiert wird. In diesem Fall werden die Zeileninformationen in den Informationen angezeigt , wenn eine Sitzung von einer anderen Sitzung blockiert wird V$SESSION
.
Sie können die Zeilen-ID abrufen. Erstellen Sie ein Beispiel mit zwei Sitzungen:
SESSION1> create table test as select * from all_objects;
Table created
SESSION1> select rowid from test where object_name = 'TEST' for update;
ROWID
------------------
AAMnFEAAaAAALTDAAz
/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');
PL/SQL procedure successfully completed
SESSION2> select 1 from test where object_name = 'TEST' for update;
/* this will block */
Sitzung 2 wartet jetzt auf Sitzung 1. Wir können die blockierende Zeile mit folgender Adresse ermitteln :
SESSION1> SELECT o.object_name,
2 dbms_rowid.ROWID_CREATE (1,
3 s.ROW_WAIT_OBJ#,
4 s.ROW_WAIT_FILE#,
5 s.ROW_WAIT_BLOCK#,
6 s.ROW_WAIT_ROW#) rid
7 FROM dba_objects o, v$session s
8 WHERE o.object_id = s.row_wait_obj#
9 AND s.client_info = '012345';
OBJECT_NAME RID
--------------- ------------------
TEST AAMnFEAAaAAALTDAAz
Zur weiteren Lektüre: eine Beschreibung des Prozesses von Tom Kyte .