Kiedy rekord jest zablokowany, czy możemy wiedzieć, który jest zablokowany?
Jak mogę uzyskać rekord rowid lub coś innego?
Mogę uzyskać informacje o tym sql
SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
Znalazłem metodę w sieci, aby uzyskać Rowid za pomocą funkcji DBMS_ROWID.ROWID_CREATE()
Ale to nie działa.
V$LOCK
.Odpowiedzi:
Nie można tak naprawdę wymienić wszystkich wierszy blokowanych przez sesję. Jednak gdy sesja jest blokowana przez inną, możesz dowiedzieć się, która sesja / wiersz ją blokuje.
Oracle nie utrzymuje listy pojedynczych blokad wierszy. Zamiast tego zamki są rejestrowane bezpośrednio w samych rzędach - pomyśl o tym jak o dodatkowej kolumnie.
Możesz zobaczyć, która sesja uzyskała blokadę obiektu poprzez
V$LOCK
widok, ale wyświetli to tylko informacje ogólne, a nie na poziomie wiersza.W tym widoku możesz również sprawdzić, czy sesja jest blokowana przez inną. W takim przypadku, jeśli sesja jest blokowana przez inną sesję, informacje o wierszu są wyświetlane w
V$SESSION
informacjach.Możesz pobrać rowid, zbudujmy przykład z 2 sesjami:
Sesja 2 czeka teraz na sesję 1. Możemy odkryć wiersz blokujący za pomocą:
Do dalszej lektury: opis procesu autorstwa Toma Kyte'a .
źródło
Wszystkie blokady tabel można znaleźć w bazie danych Oracle, uruchamiając następujące zapytanie
źródło