Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Blokady Oracle i blokady tabeli:jak to działa

Baza danych Oracle jest szeroko stosowaną bazą danych w przemyśle. Tutaj próbuję wyjaśnić o blokadach Oracle, blokadach tabeli Oracle

Spis treści

Co to jest Oracle Enqueue i blokady

Enqueue to blokady Oracle, które serializują operacje do wspólnej struktury. Wspólną strukturą może być tabela, ponawianie wątków i transakcje.

Gdy użytkownik A aktualizuje wiersz 12 w tabeli, uzyskuje transakcję W kolejce (blokada). Jest to uzyskiwane, aby każdy użytkownik, którego próbuję zaktualizować ten sam wiersz 12 w tabeli, będzie czekał, aż użytkownik A zatwierdzi transakcję. Więc teraz, jeśli użytkownik B spróbuje zaktualizować ten sam wiersz, będzie czekał w kolejce.

Gdy użytkownik A zatwierdzi transakcję, transakcja użytkownika B będzie kontynuowana

Mamy kolejkę lokalną w bazie danych pojedynczej instancji, podczas gdy w przypadku Oracle RAC mamy kolejkę lokalną i globalną do zarządzania współdzielonym zasobem

Co to jest identyfikator kolejki

Kolejki są jednoznacznie identyfikowane za pomocą formatu

Zasób może

TM -> blokady stołu

MR->Odzyskiwanie nośników

TX->Transakcja

Id1 i id2 to liczby, które są różne dla różnych typów zasobów

Podobnie jak w przypadku blokady stołu (TM), jest zapisany jako

TM--0

Gdy użytkownik żąda dostępu do zasobu w określonym trybie, generowany jest identyfikator kolejki, co wyjaśniono powyżej

Kolejka odbywa się w tym trybie

SS:tryb udostępniania wierszy

SX:tryb wyłączności wierszy

S:  Zablokuj tabelę w trybie udostępniania

SSX:Zablokuj tabelę w trybie udostępniania i wiersz w trybie wyłączności

X:Zablokuj stół w trybie wyłączności

Co to jest zasób w kolejce

Każda kolejka jest obsługiwana przez strukturę zasobów przez serwer Oracle i jest identyfikowana w sposób opisany powyżej. Struktura zasobów ma trzy listy

  1. Lista właścicieli
  2. Lista oczekujących
  3. Lista konwerterów

Gdy użytkownik żąda blokady zasobu w określonym trybie, uzyskuje strukturę blokady i wysyła żądanie uzyskania blokady na określony zasób. Jest on umieszczany na tych listach struktury zasobów zgodnie z wymaganą blokadą.

Tak więc użytkownik najpierw żąda tego zasobu, a następnie zostanie on umieszczony na liście właścicieli

Struktura zasobów jest uzyskiwana z tabeli zasobów, a struktura blokady jest uzyskiwana z tabeli blokady. Obie są alokowane w SGA

Liczba wierszy w tabeli zasobów jest określona przez parametr inicjujący enqueue_resources. Używane wartości można zobaczyć w v$resource view

Liczba wierszy w tabeli struktury blokady jest określona przez parametr inicjujący _enqueue_locks. Używane wartości można zobaczyć w v$enqueue_lock

Jak wygląda wyszukiwanie w tabeli zasobów?

  • Tabela zasobów zawiera całą strukturę zasobów. Algorytm mieszający jest używany do znalezienia i uzyskania dostępu do struktury zasobów w tabeli zasobów.
  • Tabela zasobów jest ułożona w zasobniku mieszającym. Każdy wiadro hash zawiera listę struktury zasobów w formie połączonej listy.
  • Kiedy zasób jest przeszukiwany, jego hash jest uzyskiwany za pomocą algorytmu haszującego, a następnie uzyskiwany jest zatrzask w celu znalezienia odpowiedniego segmentu haszującego, a następnie zasób jest przeszukiwany na liście w segmencie haszującym. Jeśli zasób zostanie znaleziony, pozyskiwana jest struktura blokady, a żądanie jest umieszczane na liście właściciela, kelnera i konwersji zgodnie z określonym żądanym poziomem blokady

Przykład zaszyfrowania zasobu TM-575-0 do zasobnika 1, uzyskiwany jest łańcuch haszowania kolejki zatrzaskowej w celu uzyskania dostępu do zasobnika z haszowaniem, a dostęp do listy w zasobniku w celu uzyskania struktury zasobów

  • Jeśli zasób nie zostanie znaleziony na liście zadań, a nowa struktura zasobów zostanie uzyskana z listy wolnych zasobów i umieszczona na liście zadań. Dzieje się to pod zatrzaskiem Enqueue. Przydzielona jest również struktura blokady

Żądanie blokady jest umieszczane na liście właścicieli struktury zasobów

Jak działają operacje kolejkowania?

Gdy użytkownik żąda blokady zasobu, serwer Oracle wykonuje następujące czynności

  • Jeśli nie jest aktualnie własnością, zasób jest przyznawany użytkownikowi
  • Jeśli jest własnością i są kelnerzy i konwerter, to jest umieszczany na dole kolejki kelnerów
  • Jeśli jest własnością, ale nie ma kelnera i konwertera, to jeśli jest zgodny z blokadą właściciela, żądanie jest akceptowane. Jeśli nie jest kompatybilny, jest umieszczany na liście kelnerów
  • Konwerter może kontynuować, jeśli żądanie jest mniej restrykcyjne niż aktualnie utrzymywana blokada lub żądany tryb jest zgodny z blokadą utrzymywaną przez innego właściciela
  • Kelner może kontynuować, jeśli lista konwerterów jest pusta, nie ma przed nim żadnych kelnerów, a żądana blokada jest zgodna z aktualnie posiadaną blokadą
  • Konwerter jest zawsze przetwarzany przed kelnerami.
  • Serwer Oracle sprawdza te kolejki za każdym razem, gdy blokada jest zwalniana lub konwertowana.

Jak sprawdzana jest kolejka po zwolnieniu lub konwersji blokady Oracle

  • Procesy oczekujące na zasoby śpią na semaforach, a semafory są używane jako mechanizmy usypiania/budzenia. Po dodaniu do kolejki proces żądający będzie uśpiony na semaforze przy użyciu wywołania sync_op.

sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1

  • Gdy proces przechowujący zasób jest gotowy do zwolnienia zasobu, sprawdza kolejkę dołączoną do struktury zasobów. Jeśli w kolejce znajduje się proces, wysyła sygnał semafora do oczekującego procesu za pomocą

sync_op połączenie.

sync_op (0x0005, SYNCF_BINARY, 134491620) =1

  • Proces oczekiwania obsłuży sygnał i obudzi się. Ten proces oczekiwania modyfikuje stan zgodnie z krokami podanymi w operacji wpisywania do kolejki

Typowe typy kolejek

JQ – kolejka pracy. Gdy zadanie (przesłane przez DBMS_JOB.SUBMIT) jest uruchomione, jest chronione przez kolejkę JQ (co oznacza, że ​​tylko jeden proces SNP może uruchomić zadanie).

ST – Transakcja zarządzania przestrzenią . Kolejka ST musi być utrzymywana za każdym razem, gdy sesja alokuje/dealokuje ekstenty (co oznacza, że ​​chce zmienić tabele słownikowe UET$ i FET$), jak łączenie, usuwanie/obcinanie segmentów i sortowanie dysków. Jeśli sesja przekroczy limit czasu podczas żądania kolejki ST, zwracany jest komunikat „ORA-1575 limit czasu oczekiwania na zarządzanie przestrzenią”.

TM — kolejkowanie DML (tabela). Za każdym razem, gdy sesja chce zablokować tabelę, żądana jest kolejka TM. Jeśli sesja usunie wiersz w tabeli nadrzędnej (DEPT) i zostanie utworzone ograniczenie referencyjne (klucz obcy) bez indeksu w tabeli podrzędnej (EMP) lub jeśli sesja aktualizuje kolumny, które kluczowe odniesienia do blokady udostępniania (poziom 4) są pobierane w tabeli podrzędnej. Jeśli inna sesja próbuje dokonać zmian w tabeli podrzędnej, muszą czekać (ponieważ chcą kolejkowania w trybie wyłączności wierszy, a to nie jest zgodne z trybem współdzielenia). Jeśli indeks jest tworzony w kolumnie klucza obcego tabeli podrzędnej, nie jest wymagana blokada udziału w tabeli podrzędnej.

TX – Transakcja. Natychmiast po rozpoczęciu transakcji potrzebna jest kolejka TX. Transakcja jest jednoznacznie zdefiniowana przez numer segmentu wycofywania, numer gniazda w tabeli transakcji segmentu wycofywania i numer kolejny gniazda. Sesja może czekać w kolejce TX z kilku powodów:

1) Kolejna sesja blokuje żądany wiersz.

2) Gdy dwie sesje próbują wstawić ten sam unikalny klucz do tabeli (żadna z nich nie wykonała polecenia COMMIT), wtedy ostatnia sesja czeka, aż pierwsza zostanie zatwierdzona lub wycofana.

3) W nagłówku bloku nie ma wolnego ITL (Interested Transaction List) (zwiększ INI_TRANS i PCT_FREE dla segmentu).

UL – Blokada użytkownika . Sesja została zablokowana funkcją DBMS_LOCK.REQUEST.

Widoki i tabela do przeglądania kolejki Oracle i blokad Oracle

V$session i v$session_wait

Kiedy sesja czeka na kolejkę lub blokadę, może to być sesja z V$session (w wersji 11g i nowszych) i v$session_wait

Wybierz * z v$session_wait, gdzie zdarzenie takie jak „enq%”;Parametr zdarzenia oczekiwania w kolejce ma następujące znaczenieP1:typ i tryb zasobu poszukiwanyP2:ID1 zasobuP3:ID2 zasobu

Możemy użyć poniższego zapytania, aby uzyskać całą kolejkę w systemie

Wybierz zdarzenie,p1, p2,p3 z v$session_wait, gdzie wait_time=0 i zdarzenie takie jak „enq%”;
  1. V$lock to kolejny przydatny widok do sprawdzania kolejek
  2. V$lock wyświetla listę wszystkich struktur blokad aktualnie przechowywanych w systemie
  3. Typ kolumny ,id1 i id2 reprezentują typ zasobu ,id1 i id2 struktury zasobów. Można go więc połączyć z V$resource, który zawiera listę wszystkich struktur zasobów
  • LMODE i żądanie mówią nam, która kolejka (właściciel, konwerter, kelnerzy) jest sesją
LMODE Prośba Nazwa kolejki
> 0 =0 Właściciel
=0 > 0 Kelner
> 0    >  0 Konwerter

Poniższe zapytanie może posłużyć do znalezienia posiadacza i kelnera

SELECT inst_id,DECODE(request,0,'Holder:','Weiter:')||sid sess,id1,id2,lmode, request, typeFROM V$LOCKWHERE (id1, id2, type) IN(SELECT id1 , id2, wpisz FROM V$LOCK WHERE request>0)ORDER BY id1, request;

W przypadku RAC, poniższe zapytanie może być użyte do znalezienia blokerów i kelnerów

SELECT inst_id,DECODE(request,0,'Holder:','Weiter:')||sid sess,id1,id2,lmode, request, typeFROM GV$LOCKWHERE (id1, id2, type) IN(SELECT id1 , id2, wpisz FROM gV$LOCK WHERE request>0)ORDER BY id1, request;

V$locked_object

to kolejny przydatny widok blokad tabeli Oracle

Zawiera wszystkie blokady TM w bazie danych. Podaje slot transakcji, proces systemu operacyjnego i identyfikator sesji, w której znajdują się blokady pamięci TM

Istnieje kilka widoków, których można użyć do znalezienia informacji o blokadach. Te widoki są tworzone przez catblock.sql

DBA_LOCKS Pokaż wszystkie blokady, takie jak v$lock
DBA_DML_LOCKS Pokazuje wszystkie blokady DML™ posiadane lub wymagane
DBA_DDL_LOCKS Pokazuje wszystkie blokady DDL posiadane lub wymagane
DBA_WAITERS Pokazuje wszystkie sesje oczekujące, ale nie oczekujące na blokady
DBA_BLOCKERS Pokazuje nieoczekujące sesje z blokadą jako oczekujące

Zapytanie, aby znaleźć sesję oczekiwania i sesję utrzymywania w Oracle 

ustaw rozmiar linii 1000kolumna nagłówek sesji oczekiwania 'OCZEKIWANIE|SESJA'nagłówek kolumny trzymająca_sesję 'WSTRZYMANIE|SESJA'kolumna format typu lock_type a15kolumna format mode_trzymany a15kolumna mode_requested format a15selectwaiting_session,holding_session,lock_type,mode1,balocked_waiters,mode2 

Zapytanie, aby znaleźć wszystkie zablokowane obiekty

ustaw termin na;ustaw wiersze 130;kolumna format sid_ser a12 nagłówek 'sesja,|numer seryjny';format kolumny nazwy użytkownika a12 nagłówek 'użytkownik os/|użytkownik db';format procesu kolumny a9 nagłówek 'os|proces';kolumna spid format nagłówek a7 'trace|number';kolumna owner_object format a35 nagłówek 'owner.object';kolumna w trybie zablokowanym a13 nagłówek 'locked|mode';format status kolumny a8 nagłówek 'status';selectsubstr(to_char(l.session_id)| |','||to_char(s.serial#),1,12) sid_ser,substr(l.os_user_name||'/'||l.oracle_username,1,12) username,l.process,p.spid, substr(o.owner||'.'||o.object_name,1,35) owner_object,decode(l.locked_mode,1,'Bez blokady',2,'Udostępnianie wierszy',3,'Wyłącznie wierszy',4 ,'Share',5,'Share Row Excl',6,'Exclusive',null) tryb_zablokowany,substr(s.status,1,8) statusfromv$locked_object l,all_objects     o,v$session      s,v$process      pwherel .object_id =o.object_idand l.session_id =s.sidand s.paddr      =p.addrand s.status !=„ZABIJANY”/

Jak obsługiwane są blokady DML na serwerze Oracle

Kiedy aktualizacja, wstawia, usuwa lub wybiera do aktualizacji jest wykonywana w tabeli oracle, Oracle bierze te dwie blokady

  • Blokada tabeli DML:Aby zapewnić spójność definicji obiektów na czas trwania transakcji. Zapobiega to występowaniu jakichkolwiek operacji DDL, gdy DML jest w toku.
  • DML Row Lock:Ma to na celu zapewnienie spójności danych podczas wykonywania transakcji. Możemy przeformułować w ten sposób, że uzyskuje się blokadę na konkretnym dotkniętym wierszu, a każda inna transakcja próbująca zmodyfikować ten sam wiersz zostanie zablokowana, dopóki ta, która już go posiada, nie zostanie zakończona

Jak wdrażane są blokady tabel Oracle

Wyjaśniliśmy już infrastrukturę Enqueue w poprzedniej sekcji. Zamki do stołu Oracle są zaimplementowane jako TM Enqueue

Więc struktura Enqueue byłaby

TM- -0

Tryby są

RS:udział w rzędzie

RX:wyłączność wiersza

S:udostępnij

SRX:wyłącz wiersz udostępniania

X:ekskluzywny

Każdy kursor przechowuje listę struktury blokady tabeli, która jest budowana podczas analizowania instrukcji. Przy pierwszym wykonaniu wykonywane jest wywołanie funkcji w celu zablokowania całej tabeli na liście. Blokady są zwalniane, gdy transakcja zostanie zatwierdzona lub wycofana.

Możliwość wycofania, w szczególności wycofania do punktu zapisu, dodaje kolejny wymiar złożoności do blokowania słownika. Mianowicie, jeśli transakcja zostanie wycofana poza punkt, w którym blokada została zaktualizowana, należy ją odpowiednio obniżyć w ramach operacji wycofania, aby zmniejszyć ryzyko sztucznych zakleszczeń.

Wymagania dotyczące blokowania słownika dla transakcji, aw szczególności utrzymywania historii konwersji blokad, zapewniają blokady DML w połączeniu z kolejką TM. Każda transakcja zawierająca blokadę DML zawiera również blokadę kolejki TM. Podstawowa funkcjonalność blokowania jest zapewniana przez kolejkę, a blokada DML dodaje obsługę historii konwersji.

Rozmiar stałej tablicy struktur blokad DML jest określany przez parametr DML_LOCKS. Jego wolna lista jest chroniona przez zatrzask alokacji blokady dml, a aktywne sloty są widoczne w V$LOCKED_OBJECT.

Aby ustawić DML_LOCKs, sprawdź wykorzystanie w v$resource_limit. Możemy ustawić go hojnie, ponieważ zajmuje bardzo mniej miejsca

Jak wyłączyć blokady stołu?

  • Blokady DML i powiązane blokady kolejek TM można wyłączyć, całkowicie lub tylko dla niektórych tabel.
  • Aby całkowicie wyłączyć te blokady, parametr DML_LOCKS musi być ustawiony na zero. W bazie danych serwera równoległego musi być ustawiony na zero we wszystkich instancjach.
  • Aby wyłączyć takie blokady dla określonej tabeli, należy użyć klauzuli DISABLE TABLE LOCKS instrukcji ALTER TABLE.
  • Jeśli blokady są wyłączone dla tabeli, instrukcje DML mogą nadal modyfikować bloki tabeli, a blokady na poziomie wiersza są nadal utrzymywane. Jednak blokady tabeli trybu pod-współdzielonego, zwykle skojarzone z zapytaniami, oraz blokady tabeli trybu pod-wyłączności, zwykle skojarzone z DML, nie są brane pod uwagę. Zamiast tego transakcje dotyczące tabeli są chronione przed konfliktami DDL, po prostu zabraniając wszelkich prób zablokowania całej tabeli, a tym samym wszystkich DDL względem tabeli.
  • Wyłączenie blokad tabeli może zwiększyć wydajność, ponieważ zmniejsza się narzut związany z akwizycją blokad. Jest to szczególnie ważne w przypadku RAC, gdzie ten narzut jest dość wysoki.
  • Wyłączenie blokad tabeli zapobiega również tworzeniu indeksów kluczy obcych. Ponieważ klucz obcy musi być indeksowany, aby uniknąć blokady tabeli podrzędnej, podczas gdy wiersze są manipulowane w tabeli nadrzędnej. Więc jeśli wyłączymy blokadę tabeli razem, indeksy nie są wymagane
  • Lepiej jest użyć alter table, aby wyłączyć blokady niektórych tabel, niż ustawić na dml_locks table. Jakby dml_locks było ustawione na zero, będziemy musieli odbić instancję, aby ustawić ją ponownie
  • W przypadku bezpośredniego wstawiania, sesja przeniesie kolejkę TM w tryb „X”. Zapobiega to występowaniu innych DML podczas bezpośredniego ładowania, oprócz blokowania wszystkich DDL

Jak wdrażane są blokady wierszy DML

Blokady DML Row są zaimplementowane jako kombinacja następujących dwóch rzeczy

  1. Blokada na poziomie wiersza:jest implementowana jako bajt blokady w każdym nagłówku wiersza i ITL (lista zainteresowanych transakcji) w każdym bloku danych lub indeksu. Nie są one nigdzie buforowane, a ponieważ są przechowywane w samym bloku, a nie w SGA, który jest ograniczony, ten mechanizm blokowania przez Oracle jest masowo skalowalny
  2. Blokady transakcji:są zaimplementowane jako kolejka TX

Bajt blokady wskazuje wpis ITL w bloku, a wszystkie wpisy ITL dla transakcji wskazuje na TX Enqueue, która ostatecznie określa, czy transakcja jest zatwierdzona, czy wycofana. Kelnerzy będą czekać na blokadę transakcji

Przykład

  • Transakcja A chce zaktualizować wiersze 2 i 3 w bloku. Przydzieli ITL (listę zainteresowanych transakcji). Transakcja uzyskuje dostęp do wierszy 2 i 3 i widzi bajt blokady. Jeśli bajt blokady wynosi zero, nie jest zablokowany. Transakcja zaktualizuje wiersz 3, 3
  • Teraz rozpoczyna się transakcja B   i chce zaktualizować wiersze 1 . Przydzieli ITL (listę zainteresowanych transakcji). Transakcja uzyskuje dostęp do wiersza 1 i widzi bajt blokady. Jeśli bajt blokady ma wartość zero, nie jest zablokowany. Transakcja zaktualizuje wiersz 1
  • Teraz transakcja chce zaktualizować wiersz 2. Uzyska dostęp do wiersza i znajdzie blokadę, ponieważ bajt blokady nie będzie wynosił zero. Będzie wyglądać w ITL, który trzyma zamek. Przeprowadzi czyszczenie ITL, aby dowiedzieć się, czy transakcja jest aktywna, czy nie. W takim przypadku transakcja A będzie aktywna. Tak więc transakcja B musi czekać na transakcję A, aby wycofać lub zatwierdzić. Transakcja B będzie czekać na żądanie TX Enqueue, którą transakcja A trzyma w trybie wyłączności

Czym jest lista zainteresowanych transakcji (ITL)

Kiedy sesja chce zmodyfikować blok, musi przydzielić ITL w bloku. ITL to struktura danych w nagłówku bloku, która zawiera wiele przedziałów zajmowanych przez transakcję. Jest on definiowany przez parametr INITRANS i MAXTRANS podczas tworzenia tabeli. Początkowe liczby slotów są tworzone zgodnie z INITTRANS i rosną dynamicznie do maksimum MAXTRANS

Co to jest transakcja?

Gdy sesja aktualizuje /delete/insert , rozpoczyna się transakcja. Jest zakończone, gdy nastąpi zatwierdzenie lub wycofanie. Transakcja jest identyfikowana przez identyfikator transakcji (XID). Identyfikacja transakcji składa się z trzech części

  1. Cofnij lub cofnij numer segmentu
  2. Numer boksu tabeli transakcji
  3. Sekwencja lub zawijanie nie

XID=usn#.slot#.wrap#

Każdy blok ITL będzie zawierał XID

Czyszczenie ITL oznacza wyszukanie XID w ITL i wyszukanie segmentów wycofania na podstawie tego i wyszukanie tabeli transakcji i numeru opakowania, aby sprawdzić aktywność transakcji.

Możemy użyć poniższego polecenia, aby zrzucić dowolny segment wycofania

Zmień nagłówek cofania zrzutu systemowego ;

Każda aktywna transakcja jest widoczna w tabeli v$transaction

select addr, xidusn, xidslot, xidsqnfrom v$transaction;ADDR         XIDUSN    XIDSLOT     XIDSQN-------- ---------- ---------- --- -------3C485875         50         5     3000

Identyfikator transakcji (XID) można również uzyskać we własnej sesji za pomocą

wybierz dbms_transaction.local_transaction_id z podwójnego;

Oczekiwanie na TX enq będzie widoczne w v$session_wait

P1:Nazwa|tryb

P2:rbs3|opakowanie#

P3:slot#

Podsumowanie blokad wierszy DML

Pierwszy DML w sesji, w której transakcja jeszcze nie istnieje, domyślnie utworzy transakcję.

  • Zostanie przypisany numer segmentu cofania, miejsce i zawinięcie
  • Kolejka TX zostanie utworzona

Gdy zostanie zidentyfikowany wiersz do modyfikacji, sesja weźmie wpis w ITL bloku danych i przypisze go do transakcji

  • USN/SLOT/WRAP zostanie zapisany w slocie ITL, zachowując ten slot dla bieżącej transakcji
  • Blokada zostanie podjęta w wierszu, ustawiając bajt blokady w katalogu wierszy, aby wskazywał na slot ITL bieżącej transakcji

Zarówno TM, jak i TX Enqueue można zobaczyć w V$lock

  • Typ identyfikuje TM lub TX
  • ID1 i ID2 mogą przenosić dodatkowe informacje, ale są zależne od kontekstu w odniesieniu do TYPU kolejki
  • W przypadku kolejki TM ID1 to OBJECT_ID obiektu, który jest blokowany, do którego można się odwoływać w DBA_OBJECTS, a ID2 to zawsze 0
  • Dla TX Enqueue, ID1 i ID2 przechowuj numer segmentu cofania, numer slotu i zawijanie

Szczegółowy przykład wyjaśniający działanie zamków Oracle

  • Utwórz atrapę stołu
Utwórz tabelę z j jako select * z dba_objects, gdzie rownum <3;Tabela utworzona Utwórz tabelę z j1 jako select * z dba_objects, gdzie rownum <3;Tabela utworzona
  • Sesja A
Wybierz * z j, aby zaktualizować;

Zobaczmy, co jest obecne w v$lock

SQL> wybierz odrębny identyfikator z v$mystat; SID----------2125SQL> wybierz * z v$lock, gdzie sid=2125;ADDR             KADDR                   SID TY       ID1        ID2      LMODE---------------- --- ------------- ---------- -- ---------- ---------- ----- ----- PROŚBA      CTIME      ZABLOKUJ ---------- ---------- ----------00000006B5D9D0D0 00000006B5D9D148       2125 TX    2883613   16425600           60         44          0FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       21488781          0          30         44          0

Widzimy więc tutaj

Utworzono blokadę tabeli DML Oracle

TX (blokada transakcji) została utworzona

  • Rozpocznijmy sesję B
SQL>Wybierz * z j1 do aktualizacji;SQL> wybierz odrębny identyfikator z v$mystat; SID----------2302SQL> wybierz * z v$lock, gdzie sid=2302;ADDR             KADDR                   SID TY       ID1        ID2      LMODE---------------- --- ------------- ---------- -- ---------- ---------- ----- -----ŻĄDANIE      CTIME      ZABLOKUJ ---------- ---------- ----------00000006AF7FF910 00000006AF7FF988       2302 TX    2949148   16884039          60         10          0FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 33544       0          30         10          000000006DC289D60 00000006DC289DB8       2302 AE   15062272          0          40        106          0

Widzimy więc tutaj

Utworzono blokadę tabeli DML

TX (blokada transakcji) została utworzona

Teraz spróbujmy to zrobić

Wybierz * z j, aby zaktualizować;

To się zawiesi

  • Rozpocznij kolejną sesję, aby przeanalizować problem

Jeśli widzisz szczegóły sesji o identyfikatorze sid =2032 w V$lock

wybierz * z v$lock, gdzie sid=2302;ADDR             KADDR                   SID TY        ID1       ID2      LMODE----- ------------- --- ---------- -- ---------- ---------- ---------- ZAPYTAJ      CTIME      ZABLOKUJ-- -------- ---------- ----------FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM      33544          0          30         47          000000006DC289D60 00000006DC289DB8       2302 AE   15062272           0          143     000           0          30      47           000000006DC289D60 00000006DC289DB8       2302 AE   15062272          0          143 000     60 2302 TX    2883613   16425600          0          6          7          0 FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM   21488781          0          30          7          0

Pogrubiony wiersz to żądanie 6 (ekskluzywna blokada) w niektórych połączeniach TX

Teraz możemy użyć poniższego zapytania, aby znaleźć sesję blokującą

wybierz l1.sid, 'BLOKUJE ', l2.sidfrom v$lock l1, v$lock l2gdzie l1.block =1 i l2.request> 0 i l1.id1=l2.id1 i l1.id2=l2.id2SID „ISBLOCKING”         SID---------- ------------- ----------2125 BLOKUJE        2302

Teraz możemy zatwierdzić lub wycofać sesję 2125, aby transakcja B mogła być kontynuowana. Sesję 2125 możemy zabić za pomocą poniższego polecenia, aby zwolnić blokadę

Zmień sesję zabijania systemu „2125,”;

Więcej dodatkowych informacji

Blokady TX w v$lock nie informują o wierszu, w którym występuje rywalizacja. Możemy zobaczyć te rzeczy za pomocą zapytań

Poniższe zapytanie należy wykonać z sesji, która oczekuje

SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#from v$session gdzie sid=2302ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#----------------- ----- --------- --------------- -------------21488781               461           81063             0 wybierz do.object_name, row_wait_obj#, row_wait_file #, row_wait_block#, row_wait_row#,dbms_rowid.rowid_create (1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )z v$session s, dba_objects dowhere sid=2302 i do.OBJROW_ OBJECT_NAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C ------------- -------------- ----------- ---- ------------- ------------------J21488781               461           81063             0 ABR+SNAHNAAATynAAA SQL> Wybierz * z j, gdzie wierszid =' ABR+SNAHNAAAATynAAA';

Powiązane artykuły

Jak działa blokowanie Oracle
Jak znaleźć szczegóły sesji w bazie danych Oracle
Kontrola stanu ważnej bazy danych
aplikacje Oracle dba o pytania dotyczące wywiadów
Zapytania sprawdzające blokady w bazie danych Oracle
oracle dba pytania do rozmowy kwalifikacyjnej

Polecane  kursy

Oto niektóre z zalecanych kursów, które możesz kupić, jeśli chcesz pójść o krok dalej

Poniżej podano linki do niektórych kursów


Oracle DBA 11g/12c — Administracja bazami danych dla Junior DBA :Ten kurs jest dobry dla osób, które zaczynają jako Junior DBA lub aspirują do zostania Oracle DBA. Zapewni to dobre zrozumienie zadań tworzenia kopii zapasowych i odzyskiwania oraz ogólnych zadań administracyjnych
Baza danych Oracle:Administracja Oracle 12C R2 RAC :Ten kurs obejmuje instalację i administrację Oracle RAC. Dobry kurs dla Oracle DBA, który chce podnieść swoje umiejętności w zakresie Oracle RAC
Oracle Data Guard:Administrowanie bazą danych dla Oracle 12C R2 :Ten kurs obejmuje instalację i administrację Oracle Dataguard. Dobry kurs dla Oracle DBA, który chce podnieść swoje umiejętności w zakresie Oracle Dataguard


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z Oracle JDeveloper 12c z Oracle Database 12c na Oracle Cloud Platform, część 2

  2. Co oznacza następujący błąd Oracle:nieprawidłowy indeks kolumny

  3. Hibernacja znacznika czasu ze strefą czasową

  4. Usunąć wszystkie rekordy oprócz ostatniego?

  5. Połączenie zawiesza się po czasie bezczynności