sql >> Database >  >> RDS >> Oracle

Oracle Sloten &tafelsloten:hoe het werkt

Oracle-database is de meest gebruikte database in de industrie. Hier probeer ik uit te leggen  over Oracle-vergrendelingen, Oracle-tabelvergrendelingen

Inhoudsopgave

Wat is Oracle Enqueue en vergrendelt

Enqueue zijn Oracle-sloten die de bewerkingen serialiseren naar de gedeelde structuur. De gedeelde structuur kan een tabel zijn, threads opnieuw uitvoeren en transacties.

Wanneer een gebruiker A een rij 12 in de tabel bijwerkt, verkrijgt hij de transactie Enqueue (lock). Dit is zo verkregen dat elke gebruiker die ik diezelfde rij 12 in de tabel probeer bij te werken, zal wachten tot gebruiker A de transactie begaat. Dus als gebruiker B nu dezelfde rij probeert bij te werken, wacht hij op de wachtrij.

Zodra gebruiker A de transactie heeft uitgevoerd, zal de transactie van gebruiker B doorgaan

We hebben een lokale wachtrij in de database met één instantie, terwijl we met Oracle RAC een lokale wachtrij en een wereldwijde wachtrij hebben om de gedeelde bron te beheren

Wat is wachtrij-ID

Wachtrijen worden uniek geïdentificeerd met behulp van het formaat

Bron kan

TM -> tafelsloten

MR-> Mediaherstel

TX-> Transactie

Id1 en id2 zijn nummers die verschillend zijn voor verschillende resourcetypes

Net als voor table lock (TM), wordt het geschreven als

TM--0

Wanneer een gebruiker in een bepaalde modus toegang tot de bron aanvraagt, wordt een wachtrij-ID gegenereerd die hierboven is uitgelegd

Wachtrijen worden in deze modus vastgehouden

SS:  Modus voor het delen van rijen

SX:Rij exclusieve modus

S:  Vergrendel de tafel in de deelmodus

SSX:vergrendel de tafel in de deelmodus en rij in de exclusieve modus

X:vergrendel de tafel in exclusieve modus

Wat is Enqueue resource

Elke wachtrij wordt onderhouden via een bronstructuur door de Oracle-server en wordt geïdentificeerd zoals hierboven uitgelegd. Een resourcestructuur heeft drie lijsten

  1. Eigenaarlijst
  2. Wachtlijst
  3. Converterslijst

Wanneer een gebruiker in een bepaalde modus een vergrendeling op een resource aanvraagt, heeft deze een vergrendelingsstructuur verkregen en doet hij een verzoek om de vergrendeling van een bepaalde resource te verkrijgen. Het wordt in deze lijsten van de resourcestructuur geplaatst volgens de vereiste vergrendeling.

Dus de gebruiker   vraagt ​​eerst om die bron, daarna wordt deze in de lijst met eigenaren geplaatst

Resourcestructuur wordt verkregen uit de resourcetabel en de vergrendelingsstructuur wordt verkregen uit de Lock-tabel. Ze worden beide toegewezen in SGA

Het aantal rijen in de resourcetabel wordt bepaald door de initialisatieparameter enqueue_resources. De gebruikte waarden kunnen worden bekeken in de v$resource-weergave

Het aantal rijen in de vergrendelingsstructuurtabel wordt gedefinieerd door de initialisatieparameter _enqueue_locks. De gebruikte waarden zijn te zien in v$enqueue_lock

Hoe wordt er gezocht in de resourcetabel?

  • De resourcetabel bevat de gehele resourcestructuur. Een hash-algoritme wordt gebruikt om de resourcestructuur in de resourcetabel te vinden en te openen.
  • De resourcetabel is gerangschikt in een hash-bucket. Elke hash-bucket bevat een lijst met resourcestructuren in de vorm van een gekoppelde lijst.
  • Wanneer de bron wordt gezocht, wordt de hash ervan verkregen met behulp van een hash-algoritme en vervolgens wordt de vergrendeling verkregen om de overeenkomstige hash-bucket te vinden en vervolgens wordt de bron op de lijst in de hash-bucket gezocht. Als de bron wordt gevonden, wordt de vergrendelingsstructuur verkregen en wordt het verzoek op de lijst met eigenaren, obers en conversies geplaatst volgens het gespecificeerde niveau van aangevraagde vergrendeling

Voorbeeld TM-575-0 resource gehasht naar bucket 1, Een latch enqueue hash-keten wordt verkregen om toegang te krijgen tot de hash-bucket en de lijst wordt geopend in de bucket om de resourcestructuur te verkrijgen

  • Als de bron niet in de bucketlist wordt gevonden en een nieuwe resourcestructuur wordt verkregen uit de vrije lijst met bronnen en in de bucketlist wordt geplaatst. Dit gebeurt onder de vergrendeling Enqueue. Er wordt ook een slotstructuur toegewezen

Het vergrendelingsverzoek wordt op de eigenaarslijst van de bronstructuur geplaatst

Hoe werken wachtrijbewerkingen?

Wanneer een gebruiker een vergrendeling van de bron aanvraagt, doet de Oracle-server de volgende dingen

  • Als het momenteel geen eigendom is, wordt de bron aan de gebruiker toegekend
  • Als het eigendom is en er zijn obers en converter, dan wordt het onderaan de wachtrij voor obers geplaatst
  • Als het eigendom is, maar er zijn geen ober en converter, dan wordt het verzoek ingewilligd als het compatibel is met het eigenaarsslot. Als het niet compatibel is, wordt het op de kelnerlijst geplaatst
  • Een converter mag doorgaan als het verzoek minder beperkend is dan het slot dat momenteel wordt vastgehouden of de gevraagde modus compatibel is met het slot van de andere eigenaar
  • Een ober mag doorgaan als de converterlijst leeg is, er geen obers voor staan ​​en het gevraagde slot compatibel is met het slot dat het momenteel heeft
  • Converter wordt altijd vóór de obers verwerkt.
  • De Oracle-server controleert deze wachtrijen elke keer dat het slot wordt vrijgegeven of omgezet.

Hoe de wachtrij wordt gecontroleerd wanneer Oracle-vergrendeling wordt vrijgegeven of geconverteerd

  • Processen die wachten op de hulpbronnen slapen op de semaforen, en semaforen worden gebruikt als slaap-/waakmechanisme. Nadat het in de wachtrij is geplaatst, slaapt het aanvraagproces op de semafoor met behulp van de sync_op-aanroep.

sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1

  • Zodra het proces dat de bron bevat, klaar is om de bron vrij te geven, kijkt het naar de wachtrij die aan de bronstructuur is gekoppeld. Als er een proces in de wachtrij staat, stuurt het een semafoorsignaal naar het wachtende proces met

sync_op oproep.

sync_op(0x0005, SYNCF_BINARY, 134491620) =1

  • Het wachtproces verwerkt het signaal en wordt wakker. Dit wachtproces wijzigt de status volgens de stappen die worden gegeven in de wachtrijbewerking

Veelvoorkomende soorten wachtrij

JQ – Opdrachtwachtrij. Wanneer een taak (ingediend door DBMS_JOB.SUBMIT) wordt uitgevoerd, wordt deze beschermd door een JQ-wachtrij (wat betekent dat slechts één SNP-proces de taak kan uitvoeren).

ST – Transactie voor ruimtebeheer . De ST-wachtrij moet worden gehouden telkens wanneer de sessie gebieden toewijst/de-toewijst (wat betekent dat u de woordenboektabellen UET$ en FET$ wil wijzigen), zoals samenvoegen, weglaten/afkappen van segmenten en schijfsortering. Als de sessie een time-out krijgt bij het aanvragen van de ST-wachtrij, wordt 'ORA-1575 time-out in afwachting van ruimtebeheer' geretourneerd.

TM – DML (tabel)  in wachtrij plaatsen. Elke keer dat een sessie een tafel wil vergrendelen, wordt er een TM-wachtrij gevraagd. Als een sessie een rij verwijdert in de bovenliggende tabel (DEPT) en er een referentiële beperking (vreemde sleutel) wordt gecreëerd zonder een index op de onderliggende tabel (EMP), of als de sessie de kolom(men) bijwerkt die de vreemde sleutelverwijzingen naar een gedeelde vergrendeling (niveau 4)  worden genomen in de onderliggende tabel. Als een andere sessie wijzigingen probeert aan te brengen in de onderliggende tabel, moeten ze wachten (omdat ze de wachtrij in rij-exclusieve modus willen hebben, en dat is niet compatibel met de deelmodus). Als er een index wordt gemaakt op de externe sleutelkolom van de child-table, is er geen sharelock vereist op de child-table.

TX – Transactie. Zodra een transactie is gestart, is een TX-wachtrij nodig. Een transactie wordt uniek gedefinieerd door het rollback-segmentnummer, het slotnummer in de transactietabel van het rollback-segment en het volgnummer van het slotnummer. Een sessie kan om verschillende redenen wachten op een TX-wachtrij:

1) Een andere sessie vergrendelt de gevraagde rij.

2) Wanneer twee sessies proberen dezelfde unieke sleutel in een tabel in te voegen (geen van hen heeft een COMMIT gedaan), dan wacht de laatste sessie op de eerste COMMIT of ROLLBACK.

3) Er zijn geen gratis ITL (Interested Transaction List) in de blokkop (verhoog INI_TRANS en PCT_FREE voor het segment).

UL – Gebruikersvergrendeling . Een sessie is geblokkeerd met de functie DBMS_LOCK.REQUEST.

Beelden en tabel om Oracle-wachtrij en Oracle-vergrendelingen te bekijken

V$session en v$session_wait

Wanneer de sessie wacht op wachtrij of lock, kan dit een sessie zijn van V$session (in 11g en hoger) en v$session_wait

Selecteer * uit v$session_wait waarbij gebeurtenis zoals 'enq%';De parameter van de wachtgebeurtenis in wachtrij   de volgende betekenis heeftP1:resourcetype en modus wantedP2:ID1 van de resourceP3:ID2 van de resource

We kunnen onderstaande query gebruiken om alle wachtrijen in het systeem te verkrijgen

Selecteer evenement,p1, p2,p3 uit v$session_wait  waar wait_time=0 en evenement zoals 'enq%';
  1. V$lock is een andere handige weergave om wachtrijen te controleren
  2. V$lock geeft een overzicht van alle slotstructuren die momenteel in het systeem aanwezig zijn
  3. Het kolomtype ,id1 en id2 vertegenwoordigen het resourcetype ,id1 en id2 van de resourcestructuur. Het kan dus worden samengevoegd met V$resource die de lijst met alle resourcestructuren bevat
  • LMODE en verzoek vertellen ons welke wachtrij (eigenaar, converter, obers) de sessie is
LMODE Verzoek Wachtrijnaam
> 0 =0 Eigenaar
=0 > 0 Ober
> 0    >  0 Convertor

Onderstaande zoekopdracht kan worden gebruikt om houder en ober te vinden

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

In het geval van RAC kan onderstaande zoekopdracht worden gebruikt om blokkers en obers te achterhalen

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

V$locked_object

het is een andere nuttige weergave voor Oracle-tafelvergrendelingen

Het bevat alle TM-sloten in de database. Het geeft het transactieslot, het OS-proces en de sessie-ID van de sessie die de TM-sloten vasthoudt

Er zijn verschillende weergaven die kunnen worden gebruikt om de sloteninformatie te vinden. Deze weergaven zijn gemaakt door catblock.sql

DBA_LOCKS Toon alle sloten zoals v$lock
DBA_DML_LOCKS Toont alle DML™-vergrendelingen die worden vastgehouden of worden aangevraagd
DBA_DDL_LOCKS Toont alle DDL-vergrendelingen die worden vastgehouden of worden aangevraagd
DBA_WAITERS Toont alle sessies die wachten op, maar niet wachten op vergrendelingen
DBA_BLOCKERS Toont niet-wachtende sessies met vergrendelingen waarop gewacht wordt

Vraag om informatie over wachtende sessies en het vasthouden van sessies in Oracle 

regelgrootte 1000kolom instellen wait_session kop 'WAITING|SESSION'kolom holding_session kop 'HOLDING|SESSION'column lock_type formaat a15column mode_held formaat a15column mode_requested formaat a15selectwaiting_session,holding_session,lock_type,mode_held,mode_id1,locked,pre> 

Vraag om alle vergrendelde objecten te achterhalen

term instellen op;stel regels 130;kolom sid_ser formaat a12 kop 'session,|serial#';kolom gebruikersnaam formaat a12 kop 'os gebruiker/|db gebruiker';kolom proces formaat a9 kop 'os|process';kolom spid-formaat a7 kop 'trace|getal';kolom owner_object formaat a35 kop 'owner.object';kolom vergrendeld_mode formaat a13 kop 'locked|mode';kolom status formaat a8 kop '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) gebruikersnaam,l.process,p.spid, substr(o.owner||'.'||o.object_name,1,35) owner_object,decode(l.locked_mode,1,'No Lock',2,'Row Share',3,'Row Exclusive',4 ,'Share',5,'Share Row Excl',6,'Exclusive',null) locked_mode,substr(s.status,1.8) statusfromv$locked_object l,all_objects     o,v$session       s,v$process       pwhere .object_id =o.object_idand l.session_id =s.sidand s.paddr      =p.addrand s.status !='KILLED'/

Hoe de DML-vergrendelingen worden afgehandeld op de Oracle-server

Wanneer een update, invoeging, verwijdering of selectie voor update wordt uitgevoerd op de orakeltabel, neemt Oracle deze twee vergrendelingen over

  • DML-tabelvergrendeling:om de consistentie van de objectdefinitie voor de duur van de transactie te garanderen. Dit voorkomt dat er DDL-bewerkingen plaatsvinden terwijl een DML bezig is.
  • DML-rijvergrendeling:dit is om de consistentie van de gegevens tijdens de uitvoering van de transactie te waarborgen. We kunnen herformuleren zoals Dit verkrijgt een slot op de specifieke rij die wordt aangeraakt en elke andere transactie die probeert dezelfde rij te wijzigen, wordt geblokkeerd, totdat degene die de rij al bezit, klaar is

Hoe Oracle-tabelvergrendelingen worden geïmplementeerd

We hebben de infrastructuur van Enqueue al uitgelegd in de vorige sectie. Oracle Table-sloten zijn geïmplementeerd als TM Enqueue

Dus wachtrijstructuur zou zijn

TM- -0

Modi zijn

RS:rij delen

RX:exclusief rij

S:delen

SRX:rij exclusief delen

X:exclusief

Elke cursor houdt een lijst bij met de tabelvergrendelingsstructuur die is opgebouwd tijdens het ontleden van de instructie. Bij de eerste uitvoering wordt een functieaanroep gedaan om alle tabellen in de lijst te vergrendelen. De vergrendelingen worden vrijgegeven wanneer de transactie wordt uitgevoerd of teruggedraaid.

De mogelijkheid van terugdraaien, met name terugdraaien naar een opslagpunt, voegt een nieuwe dimensie van complexiteit toe aan woordenboekvergrendeling. Als een transactie namelijk wordt teruggedraaid tot voorbij het punt waarop een vergrendeling is geüpgraded, moet de vergrendeling dienovereenkomstig worden gedowngraded, als onderdeel van de terugdraaibewerking, om het risico van kunstmatige impasses te verminderen.

De vereisten van woordenboekvergrendeling voor transacties en in het bijzonder het bijhouden van een geschiedenis van vergrendelingsconversies, worden geleverd door DML-vergrendelingen in combinatie met TM-wachtrij. Elke transactie met een DML-vergrendeling heeft ook een TM-enqueue-vergrendeling. De basisvergrendelingsfunctionaliteit wordt geleverd door de wachtrij en de DML-vergrendeling voegt het onderhoud van de conversiegeschiedenis toe.

De grootte van de vaste reeks DML-vergrendelingsstructuren wordt bepaald door de parameter DML_LOCKS. De vrije lijst wordt beschermd door de dml-slottoewijzingsvergrendeling en de actieve slots zijn zichtbaar in V$LOCKED_OBJECT.

Om de DML_LOCK's in te stellen, controleert u het gebruik in v$resource_limit. We kunnen het royaal instellen omdat het minder ruimte in beslag neemt

Hoe  de tafelvergrendelingen uitschakelen?

  • DML-vergrendelingen en de bijbehorende TM-wachtrijvergrendelingen kunnen geheel of alleen voor bepaalde tabellen worden uitgeschakeld.
  • Om deze vergrendelingen volledig uit te schakelen, moet de parameter DML_LOCKS op nul worden gezet. In een parallelle serverdatabase moet deze in alle gevallen op nul worden gezet.
  • Om dergelijke vergrendelingen voor een bepaalde tabel uit te schakelen, moet de DISABLE TABLE LOCKS-clausule van de ALTER TABLE-instructie worden gebruikt.
  • Als vergrendelingen voor een tabel zijn uitgeschakeld, kunnen DML-instructies nog steeds de blokken van de tabel wijzigen en worden vergrendelingen op rijniveau nog steeds vastgehouden. De tabelvergrendelingen in de sub-gedeelde modus die normaal gesproken worden geassocieerd met query's, en de tabelvergrendelingen van de sub-exclusieve modus die normaal gesproken worden geassocieerd met DML, worden niet gebruikt. In plaats daarvan worden transacties tegen de tafel beschermd tegen conflicterende DDL door simpelweg alle pogingen om de hele tafel te blokkeren, en dus alle DDL tegen de tafel, te verbieden.
  • Als u de tafelvergrendelingen uitschakelt, kunnen de prestaties verbeteren omdat de overhead voor het verwerven van vergrendelingen wordt verminderd   Dit is vooral belangrijk in het geval van RAC waar deze overhead vrij hoog is.
  • Het uitschakelen van de tabelvergrendelingen voorkomt ook dat er indexen voor externe sleutels worden gemaakt. Als een externe sleutel moet worden geïndexeerd om te voorkomen dat de onderliggende tabel wordt vergrendeld terwijl de rijen in de bovenliggende tabel worden gemanipuleerd. Dus als we de tafelvergrendeling allemaal samen uitschakelen, zijn indexen niet vereist
  • Het verdient de voorkeur om de tabel wijzigen te gebruiken om de tabelvergrendelingen op een tabel uit te schakelen, dan om de tabel dml_locks in te stellen. Alsof dml_locks is ingesteld op nul, moeten we de instantie bouncen om deze opnieuw in te stellen
  • Bij direct laden invoegen, zal een sessie de TM-wachtrij in de 'X'-modus zetten. Dit voorkomt dat andere DML plaatsvindt terwijl de directe belasting plaatsvindt, naast het blokkeren van alle DDL

Hoe DML-rijvergrendelingen worden geïmplementeerd

DML Rijvergrendelingen worden geïmplementeerd als een combinatie van de volgende twee dingen

  1. Lijst op rijniveau:het wordt geïmplementeerd als vergrendelingsbyte in elke rijkop en ITL (lijst met geïnteresseerde transacties) in elk gegevens- of indexblok. Deze worden nergens in de cache opgeslagen en omdat ze in het blok zelf worden opgeslagen, niet in SGA die beperkt is, is dit mechanisme van Locking by Oracle enorm schaalbaar
  2. Transactievergrendelingen:deze worden geïmplementeerd als TX Enqueue

De lock-byte verwijst naar de ITL-vermelding in het blok en alle ITL-vermeldingen voor de transactie verwijzen naar de TX-wachtrij die uiteindelijk bepaalt of de transactie is vastgelegd of teruggedraaid. De obers wachten op transactievergrendeling

Voorbeeld

  • Een transactie A wil rij 2 en 3 in het blok bijwerken. Het zal een ITL (geïnteresseerde transactielijst) toewijzen. De transactie geeft toegang tot rij 2 en 3 en ziet de vergrendelingsbyte. Als de vergrendelingsbyte nul is, is deze niet vergrendeld. De transactie werkt de rij 3 ,3
  • . bij
  • Nu start een transactie B   en deze wil de rijen 1 updaten. Het zal een ITL (geïnteresseerde transactielijst) toewijzen. De transactie heeft toegang tot rij 1 en ziet de vergrendelingsbyte. Als de vergrendelingsbyte nul is, is deze niet vergrendeld. De transactie zal rij 1 updaten
  • Nu wil de transactie rij 2 updaten. Het zal toegang krijgen tot de rij en zal het vergrendeld vinden omdat de lock-byte niet nul zal zijn. Het zal in de ITL kijken die het slot vasthoudt. Het zal ITL-opschoning uitvoeren om erachter te komen of de transactie actief of niet actief is. In dit geval zal het Transactie A actief vinden. Dus transactie B moet wachten op transactie A om terug te draaien of vast te leggen. Transactie B wacht op het opvragen van de TX Enqueue die transactie A in exclusieve modus houdt

Wat is Geïnteresseerde Transactielijst (ITL)

Wanneer een sessie een blok wil wijzigen, moet het een ITL in het blok toewijzen. ITL is de gegevensstructuur in de blokkop die veel slots bevat die door de transactie worden ingenomen. Het wordt gedefinieerd door de parameter INITRANS en MAXTRANS wanneer de tabel wordt gemaakt. Het aanvankelijke aantal slots wordt gecreëerd volgens INITTRANS en groeit dynamisch tot het maximum van MAXTRANS

Wat is transactie?

Wanneer een sessie-update /delete/insert, dan wordt een transactie gestart. Het is voltooid wanneer de commit of rollback heeft plaatsgevonden. Een transactie wordt geïdentificeerd door transactie-ID (XID). De transactie identificeert bestaat uit drie delen

  1. Segmentnummer terugdraaien of ongedaan maken
  2. Transactietabel Slotnummer
  3. Volg of wikkel nee

XID=usn#.slot#.wrap#

Elk blok ITL zal de XID bevatten

Een ITL-opruiming betekent zoeken naar de XID in de ITL en op basis hiervan de rollback-segmenten doorzoeken en de transactietabel en het wrap-nummer zoeken om te controleren op de transactieactiviteit.

We kunnen het onderstaande commando gebruiken om elk terugdraaisegment te dumpen

Wijzig systeemdump ongedaan maken header ;

Elke actieve transactie is te zien in de v$transactietabel

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

De transactie-ID (XID) kan ook in de eigen sessie worden verkregen met

selecteer dbms_transaction.local_transaction_id van dual;

Het wachten op TX enq zal worden gezien in v$session_wait

P1:Naam|modus

P2:rbs3|wrap#

P3:slot#

Om de DML-rijvergrendelingen samen te vatten

De eerste DML in een sessie waarin een transactie nog niet bestaat, zal impliciet een transactie aanmaken.

  • Er wordt een segmentnummer, slot en omslag voor ongedaan maken toegewezen
  • TX-wachtrij wordt geïnstantieerd

Wanneer een rij die moet worden gewijzigd wordt geïdentificeerd, neemt de sessie een invoer in de ITL van het gegevensblok en wijst deze toe aan de transactie

  • USN/SLOT/WRAP wordt naar het ITL-slot geschreven, waarbij dat slot wordt gereserveerd voor de huidige transactie
  • Lock wordt op de rij genomen door de lock-byte in de rijdirectory in te stellen om naar het ITL-slot van de huidige transactie te wijzen

Zowel de TM- als de TX-wachtrij zijn te zien in V$lock

  • Type identificeert TM of TX
  • ID1 en ID2 kunnen aanvullende informatie bevatten, maar zijn contextgevoelig met betrekking tot het wachtrijtype
  • Voor TM-wachtrij is ID1 de OBJECT_ID van het object dat wordt vergrendeld, waarnaar kan worden verwezen in DBA_OBJECTS, en ID2 is altijd 0
  • Voor TX Enqueue, ID1 en ID2 houden het segmentnummer voor ongedaan maken, het slotnummer en de wrap vast

Gedetailleerd voorbeeld om uit te leggen dat de orakelsloten werken

  • Maak de dummy-tabel
Maak een tabel van j als select * van dba_objects waar rownum <3;Tabel gemaakt Maak een tabel van j1 als select * van dba_objects waar rownum <3;Tabel gemaakt
  • Sessie A
Selecteer * van j voor update;

Laten we eens kijken wat er aanwezig is in v$lock

SQL> selecteer een andere sid van v$mystat; -------------2125SQL> selecteer * van v$lock waar sid=2125;ADDR             KADDR                   SID TY        ID1        ID2   --- LMODE  ---- LMODE--- ------------- ---------- -- ---------- ---------- ----- ----- Verzoek CTime Block ---------- ---------- ---------- 00000006B5D9D0D0 00000006B5D9D148 2125 TX 2883613 16425600 60 44 0FFFFFFFFFFFff7DA4B360 21488781          0          30         44          0

Dus we zien hier

DML Oracle-tabelvergrendeling is gemaakt

TX(transactieslot) is aangemaakt

  • Laten we sessie B starten
SQL>Selecteer * van j1 voor update;SQL> selecteer verschillende sid van v$mystat; ---SID----------2302SQL> selecteer * van v$lock waar sid=2302;ADDR             KADDR                   SID TY        ID1         ID2 ----- LDE------- LDE ------------- ---------- -- ---------- ---------- ----- -----VERZOEK      CTIME      BLOCK---------- ---------- ----------00000006AF7FF910 00000006AF7FF988       2302 TX    2949148   16884039      0 7     60 33544          0          30         10          000000006DC289D60 00000006DC289DB8       2302 AE   15062272             40        40      

Dus we zien hier

DML-tabelvergrendeling is gemaakt

TX(transactieslot) is aangemaakt

Laten we nu proberen om

Selecteer * van j voor update;

Dit blijft hangen

  • Laat de volgende sessie starten om het probleem te analyseren

Als je de sessie sid =2032 details ziet in V$lock

selecteer * van v$lock waarbij sid=2302;ADDR             KADDR                   SID TY        ID1        ID2      LMODE---------------- --- ---------- -- ---------- ---------- ----------VERZOEK      CTIME      BLOK-- -------- ---------- ----------FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM      33544          0          30         47          000000006DC289D60 00000006DC289DB8       2302 AE   15062272          0          40        143          000000006DC289808 00000006DC289860 2302 TX    2883613   16425600          0          6          7          0 FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM   21488781          0          30          7          0

De vetgedrukte rij is verzoek 6 (exclusief slot) op sommige TX enq

Nu kunnen we onderstaande zoekopdracht gebruiken om de blokkeersessie te vinden

selecteer l1.sid, ' IS BLOCKING ', l2.sidvan v$lock l1, v$lock l2where l1.block =1 en l2.request> 0and l1.id1=l2.id1and l1.id2=l2.id2SID 'ISBLOKKEREN'         SID---------- ------------- ----------2125  IS BLOKKEREN        2302

Nu kunnen we sessie 2125 vastleggen of terugdraaien om transactie B door te laten gaan. We kunnen de sessie 2125 beëindigen met behulp van de onderstaande opdracht, ook om de vergrendeling op te heffen

Verander systeem-kill-sessie '2125,';

Nog meer aanvullende informatie

De TX-vergrendelingen in v$lock vertellen de rij-informatie niet waar de bewering aanwezig is. We kunnen die dingen bekijken met behulp van de zoekopdrachten

De onderstaande query moet worden uitgevoerd vanuit de sessie die  wacht

SQL> selecteer row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#from v$session waarbij sid=2302ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#---------- --------- --------------- -------------21488781            461           81063             0 select 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# )van v$session s, dba_objects dowhere sid=2302 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> Selecteer * van j waar rowid =' ABR+SNAHNAAATynAAA';

Gerelateerde artikelen

Hoe Oracle-vergrendeling werkt
Sessiedetails vinden in Oracle-database
Belangrijke databasestatuscontrole
Oracle-apps dba-interviewvragen
Query's om sloten in Oracle-database te controleren
orakel dba sollicitatievragen

Aanbevolen  cursussen

Hier volgen enkele van de aanbevolen cursussen die u kunt kopen als u een stap verder wilt gaan

Hieronder staan ​​de links naar enkele van de cursussen


Oracle DBA 11g/12c – Databasebeheer voor Junior DBA :Deze cursus is goed voor mensen die beginnen als Junior DBA of die Oracle DBA willen worden. Dit geeft een goed begrip van back-up &herstel en algemene beheertaken
Oracle Database:Oracle 12C R2 RAC Administration :Deze cursus behandelt de installatie en het beheer van Oracle RAC. Een goede cursus voor Oracle DBA die zijn vaardigheden voor Oracle RAC wil upgraden
Oracle Data Guard:Database Administration for Oracle 12C R2 :Deze cursus behandelt de installatie en het beheer van Oracle Dataguard. Een goede cursus voor Oracle DBA die zijn vaardigheden voor Oracle Dataguard wil verbeteren


  1. SQL herkent kolomalias niet in where-clausule

  2. Transparante gegevenscodering (TDE) in SQL Server in een AlwaysOn-beschikbaarheidsgroep op voorbeeld

  3. Hoe een uitzondering binnen een trigger te verhogen? Is er een manier om dit te doen?

  4. Fix "ERROR 1054 (42S22):Onbekende kolom '...' in 'bestellingsclausule' bij gebruik van UNION in MySQL