Deadlock detected er noget der opstår når 2 eller flere brugere/prosesser venter på data, låst af hinanden i Oracle. Oracle er dog så smart lavet, at deadlocks opdages, og når det sker, foretages en rollback på et af de ventende udtryk, for dermed at frigive et af de låste sæt data. 

Når det iøvrigt sker signalere Oracle en fejl - ORA-00060 Deadlock detected, samtidigt med der lander en trace fil i UDUMP kataloget, med information omkring fejlen.

For at starte så er følgende et eksempel på en deadlock. Jeg har 2 forbindelser til min base via sqlplus (SES1 og SES2).

SES1

SQL> UPDATE emp SET sal=sal+100;
14 rows updated.

SES2

SQL> UPDATE dept SET loc = 'Copenhagen';
4 rows updated.

SES1 opdaterer nu DEPT. Sessionen vil hænge idet den venter på en lås (Ikke en deadlock endnu)

SQL> UPDATE dept SET loc = 'Copenhagen';

SES2 opdaterer nu EMP og der forudsager en deadlock

SQL> UPDATE emp SET sal=sal+100;

Oracle opdater situationen og foretager en rollback - dermed også en trace med information omkring situationen i UDUMP.

SQL> UPDATE emp SET sal=sal+100;
UPDATE emp SET sal=sal+100
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

Mere skematisk kan ovenstående illustreres ved

Tid        session   SQL

T1         S1       UPDATE emp SET sal=sal+100;
T2         S2       UPDATE dept SET loc = 'Copenhagen';
T3         S1       UPDATE dept SET loc = 'Copenhagen'; Denne venter indtil S2 fortager commit el. rollback
T4         S2       UPDATE emp SET sal=sal+100; Denne forudsager vores Deadlock og foretager Rollback.

Trace filen i UDUMP kataloget er vigitg i forbindelse med deadlock situationer. Den indeholder information omkring hvilken SQL der forudsager deadlocken, og sker dette på regulært basis - kan man den vej igennem få identificeret den applikation der har problemet, og efterfølgende få det rettet, evt ved brug af FOR UPDATE og NOWAIT.