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-
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
- Lista właścicieli
- Lista oczekujących
- 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%”;
- V$lock to kolejny przydatny widok do sprawdzania kolejek
- V$lock wyświetla listę wszystkich struktur blokad aktualnie przechowywanych w systemie
- 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,mode2Zapytanie, 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-
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
- 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
- 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
- Cofnij lub cofnij numer segmentu
- Numer boksu tabeli transakcji
- 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