sql >> Databasteknik >  >> RDS >> Oracle

Hitta orsaken till dödlägesfel från oracle trace-fil

Först av allt, select uttalande lås aldrig något i Oracle, använder bara den senaste tillgängliga konsekventa versionen av data. Det är inte ett fall för select ... for update som låser data som update sedan Oracle 9i, men det finns ingen for update klausul i frågan från frågan.

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

Session #72 har tabellnivålås (TM) med "Row Exclusive" typ (SX) och vill skaffa "Share Row Exclusive" (SSX) lås på samma bord. Denna session blockerad av session #24 som redan har tabellnivålås av samma typ (SX) och väntar medan SSX-lås skulle vara tillgängligt.

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

Detta (andra raden) visar exakt samma situation, men i motsatt riktning:Session #24 väntar på att SSX-låset blir tillgängligt, men blockeras av SX-låset på samma bord.

Så, Session #24 och Session #72 blockerar varandra:dödläge inträffar.

Båda låstyperna (SX och SSX) är lås på bordsnivå.
För att förstå situationen rekommenderar jag att du läser den här artikeln av Franck Pachot.

Nedan finns citat från denna artikel, som är direkt relevant för din situation (observera att SSX- och SRX-förkortningar är likvärdiga):

Referensintegritet förvärvar också TM-lås. Till exempel leder det gemensamma problemet med oindexerade främmande nycklar till S-lås på den underordnade tabellen när du utfärdar en radering, eller uppdatering av nyckeln, på den överordnade tabellen. Detta beror på att Oracle utan ett index inte har någon enskild resurs på lägre nivå att låsa för att förhindra en samtidig infogning som kan bryta mot dess referensintegritet.
När kolumnerna för främmande nyckel är de ledande kolumnerna i ett vanligt index, då den första indexposten med föräldravärdet kan användas som en enskild resurs och låsas med en radnivå TXlock.
Och vad händer om referensintegritet har en på raderingskaskad? Utöver S-läget finns det avsikten att uppdatera rader i den underordnade tabellen, som i Row X-läget (RX). Det är här share rowexclusive (SRX) förekommer:S+RX=SRX.

Så den mest troliga varianten är att session #72 och session #24 tar bort några rader i EMPLOYEE tabell samtidigt, och det finns on delete cascade begränsning för EMPSAL_EMP_ID i samband med frånvaro av index på EMPLOYEE_SALARY tabell i vilken EMPSAL_EMP_ID kolumnen listad först.




  1. Hur man återställer MySQL root-lösenord

  2. Oracle PL/SQL Bulk Collect med Spara undantag Exempel

  3. psql:kunde inte ansluta till servern:Anslutning nekades Fel vid anslutning till fjärrdatabas

  4. Versaler av personnamn i programmering