sql >> Database teknologi >  >> RDS >> Oracle

Finder årsagen til deadlock-fejl fra oracle trace-fil

Først og fremmest select sætning lås aldrig noget i Oracle, bruger bare den sidste tilgængelige konsistente version af data. Det er ikke en sag for select ... for update som låser data som update siden Oracle 9i, men der er ingen for update klausul i forespørgslen fra spørgsmålet.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

Session #72 har bordniveaulås (TM) med "Row Exclusive" type (SX) og ønsker at erhverve "Share Row Exclusive" (SSX) lås på samme bord. Denne session er blokeret af session #24, som allerede har bordniveaulås af samme type (SX) og venter, mens SSX-lås er tilgængelig.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Denne (anden række) viser nøjagtig samme situation, men i modsat retning:Session #24 venter på, at SSX-låsen bliver tilgængelig, men blokeret af session #72, som allerede har SX-lås på samme bord.

Så Session #24 og Session #72 blokerer for hinanden:dødvande sker.

Begge låsetyper (SX og SSX) er låse på bordniveau.
For at forstå situationen anbefaler jeg at læse denne artikel af Franck Pachot.

Nedenfor er citat fra denne artikel, som er direkte relevant for din situation (bemærk, at SSX- og SRX-forkortelser er ækvivalente):

Referenceintegritet erhverver også TM-låse. F.eks. fører det almindelige problem med uindekserede fremmednøgler til S-låse på den underordnede tabel, når du udsteder en sletning eller opdatering på nøglen på den overordnede tabel. Dette skyldes, at Oracle uden et indeks ikke har en enkelt ressource på et lavere niveau, der skal låses for at forhindre en samtidig indsættelse, der kan krænke deres referentielle integritet.
Når fremmednøglekolonnerne er de førende kolonner i et almindeligt indeks, så er den første indeksindgang med forældreværdien kan bruges som en enkelt ressource og låses med en rækkeniveau TXlock.
Og hvad nu hvis referenceintegritet har en på slette-kaskade? Ud over S-tilstanden er der hensigten at opdatere rækker i den underordnede tabel, som med Row X (RX)-tilstand. Det er her share rowexclusive (SRX) forekommer:S+RX=SRX.

Så den mest sandsynlige variant er, at session #72 og session #24 sletter nogle rækker i EMPLOYEE tabel på samme tid, og der er on delete cascade begrænsning for EMPSAL_EMP_ID i forbindelse med fravær af indeks på EMPLOYEE_SALARY tabel, hvori EMPSAL_EMP_ID kolonne angivet først.




  1. Sådan importeres/gendannes MySql-tabeller ved hjælp af PHP

  2. Sådan fungerer LIKE-operatøren i SQLite

  3. SQL UDENLANDSKE NØGLEBEGRÆNSNING:Den ultimative, nemme guide til nybegyndere

  4. Sådan opretter du en sammensat primær nøgle i SQL Server (T-SQL-eksempel)