Tuesday, June 9, 2026

One Case of DBMS_ALERT deadlock

In this Blog, we will demonstrate a test case of DBMS_ALERT deadlock.

Note: Tested in Oracle 19c

Open two Sqplus sessions: SESS-1 and SESS-2.


1. At T1, login to SESS-1, register two alert interests: alert_1 and alert_2, then exit the session:


exec dbms_alert.register('alert_1');

exec dbms_alert.register('alert_2');

exit;


2. At T2, re-login to SESS-1 (sid: 552), check two registered names:



-- watch two registered names, whose session is not alive.

select * from sys.dbms_alert_info where name like 'ALERT%';

NAME            SID             CHANGED    MESSAGE
--------------- --------------- ---------- ---------------
ALERT_1         0228568D0001    N
ALERT_2         0228568D0001    N

-- determines if the specified session is active.
declare
  l_unique_sid varchar2(30) := '0228CD530001';
begin
  if not dbms_session.is_session_alive(l_unique_sid) then
    dbms_output.put_line('Not Alive: (sid: ' ||to_number(substr(l_unique_sid, 1, 4), 'XXXX')||
                                ', serial#: '||to_number(substr(l_unique_sid, 5, 4), 'XXXX')||
                                   ', inst: '||to_number(substr(l_unique_sid, 9, 4), 'XXXX')||')');
  end if;
end;
/

Not Alive: (sid: 552, serial#: 52563, inst: 1)

3. At T3, continue in SESS-1, send signal: alert_2


SQL (sid:552) > exec dbms_alert.signal('alert_2', 'alert_msg_2');

4. At T4, login to SESS-2 (sid: 16), register one alert interests: alert_3


SQL (sid:16) > exec dbms_alert.register('alert_3');

--Note that this call is with default cleanup = true to perform cleanup of any extant orphaned pipes.

5. At T5, in SESS-1, check TX lock, SESS-2 (sid:16) is blocked by SESS-1 (sid: 552)


SQL (sid:552) > select * from  v$lock where type = 'TX';

ADDR             KADDR             SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK     CON_ID
---------------- ---------------- ---- -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000000B4310970 00000000B43109A0   16 TX    5505024     782554          0          6        132          0          0
00000000ADB30E70 00000000ADB30EA8  552 TX    5505024     782554          6          0        169          1          0
00000000ADBCFAB8 00000000ADBCFAF0   16 TX    6291482     236621          6          0        132          0          0

3 rows selected.

6. At T6, in SESS-1, send signal: alert_1


SQL (sid:552) > exec dbms_alert.signal('alert_1', 'alert_msg_1');

7. Both sessions throw ORA-00060


SQL (sid:552) > exec dbms_alert.signal('alert_1', 'alert_msg_1');
BEGIN dbms_alert.signal('alert_1', 'alert_msg_1'); END;

*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "SYS.DBMS_ALERT", line 431
ORA-06512: at line 1

SQL (sid:16) > exec dbms_alert.register('alert_3');
BEGIN dbms_alert.register('alert_3'); END;

*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "SYS.DBMS_ALERT", line 82
ORA-06512: at "SYS.DBMS_ALERT", line 82
ORA-06512: at "SYS.DBMS_ALERT", line 103
ORA-06512: at line 1

8. Both Deadlock trc files:


=================== testdb_ora_1851016.trc ===================

Unix process pid: 1851016, image: oracle@testdb

*** SESSION ID:(552.57779) 2026-06-09T15:35:50.836313+02:00

Deadlock graph:
                                          ------------Blocker(s)-----------  ------------Waiter(s)------------
Resource Name                             process session holds waits serial  process session holds waits serial
TX-00540000-000BF0DA-00000000-00000000         63     552     X        57779      61     196           X   9237
TX-005B0001-000BE24C-00000000-00000000         61     196     X         9237      63     552           X  57779
 
----- Information for waiting sessions -----
Session 552:
Holds resource TX-00540000-000BF0DA-00000000-00000000 acquired 245 seconds ago.
  sid: 552 ser: 57779 audsid: 131915017 user: 0/SYS
    flags: (0x41) USR/- flags2: (0x40009) -/-/INC
    flags_idl: (0x1) status: BSY/-/-/- kill: -/-/-/-
  pid: 63 O/S info: user: oracle, term: UNKNOWN, ospid: 1851016
    image: oracle@testdb
  client details:
    O/S info: user: U000380, term: WCLINBDOXKKDUGS, ospid: 57408:55064
    machine: SYS\WCLINBDOXKKDUGS program: sqlplus.exe
    application name: SQL*Plus, hash value=3669949024
  current SQL:
  UPDATE DBMS_ALERT_INFO SET CHANGED = 'Y', MESSAGE = :B2 WHERE NAME = UPPER(:B1 )
 
Session 196:
Holds resource TX-005B0001-000BE24C-00000000-00000000 acquired 3 seconds ago.
  sid: 196 ser: 9237 audsid: 131915018 user: 0/SYS
    flags: (0x10041) USR/- flags2: (0x40009) -/-/INC
    flags_idl: (0x1) status: BSY/-/-/- kill: -/-/-/-
  pid: 61 O/S info: user: oracle, term: UNKNOWN, ospid: 1850047
    image: oracle@testdb (J006)
  client details:
    O/S info: user: oracle, term: UNKNOWN, ospid: 1850047
    machine: testdb program: oracle@testdb (J006)
    application name: task-911-2 hash value=1117638710
    action name: bgp: loop: init, hash value=2828460256
  current SQL:
  DELETE DBMS_ALERT_INFO WHERE SID = :B1 
 

session 552: DID 0001-003F-000005CF	session 196: DID 0001-003D-000004C1 
session 196: DID 0001-003D-000004C1	session 552: DID 0001-003F-000005CF 
 
Rows waited on:
  Session 552: obj - rowid = 003C067C - AAPAZ8AG+AAAXuhAAB
  (dictionary objn - 3933820, file - 446, block - 97185, slot - 1)
  Session 196: obj - rowid = 003C067C - AAPAZ8AG+AAAXuhAAC
  (dictionary objn - 3933820, file - 446, block - 97185, slot - 2)

=================== testdb_ora_1851008.trc ===================

Unix process pid: 1851008, image: oracle@testdb

*** SESSION ID:(16.33150) 2026-06-09T15:35:47.444358+02:00
 
Deadlock graph:
                                          ------------Blocker(s)-----------  ------------Waiter(s)------------
Resource Name                             process session holds waits serial  process session holds waits serial
TX-0060001A-00039C4D-00000000-00000000         66      16     X        33150      63     552           X  57779
TX-00540000-000BF0DA-00000000-00000000         63     552     X        57779      66      16           X  33150
 
----- Information for waiting sessions -----
Session 16:
Holds resource TX-0060001A-00039C4D-00000000-00000000 acquired 204 seconds ago.
  sid: 16 ser: 33150 audsid: 131915016 user: 0/SYS
    flags: (0x41) USR/- flags2: (0x40009) -/-/INC
    flags_idl: (0x1) status: BSY/-/-/- kill: -/-/-/-
  pid: 66 O/S info: user: oracle, term: UNKNOWN, ospid: 1851008
    image: oracle@testdb
  client details:
    O/S info: user: U000380, term: WCLINBDOXKKDUGS, ospid: 42636:42136
    machine: SYS\WCLINBDOXKKDUGS program: sqlplus.exe
    application name: SQL*Plus, hash value=3669949024
  current SQL:
  DELETE DBMS_ALERT_INFO WHERE SID = :B1 
 
Session 552:
Holds resource TX-00540000-000BF0DA-00000000-00000000 acquired 241 seconds ago.
  sid: 552 ser: 57779 audsid: 131915017 user: 0/SYS
    flags: (0x41) USR/- flags2: (0x40009) -/-/INC
    flags_idl: (0x1) status: BSY/-/-/- kill: -/-/-/-
  pid: 63 O/S info: user: oracle, term: UNKNOWN, ospid: 1851016
    image: oracle@testdb
  client details:
    O/S info: user: U000380, term: WCLINBDOXKKDUGS, ospid: 57408:55064
    machine: SYS\WCLINBDOXKKDUGS program: sqlplus.exe
    application name: SQL*Plus, hash value=3669949024
  current SQL:
  UPDATE DBMS_ALERT_INFO SET CHANGED = 'Y', MESSAGE = :B2 WHERE NAME = UPPER(:B1 )


session 16: DID 0001-0042-0000011E	session 552: DID 0001-003F-000005CF 
session 552: DID 0001-003F-000005CF	session 16: DID 0001-0042-0000011E 
 
Rows waited on:
  Session 16: obj - rowid = 003C067C - AAPAZ8AG+AAAXuhAAC
  (dictionary objn - 3933820, file - 446, block - 97185, slot - 2)
  Session 552: obj - rowid = 003C067C - AAPAZ8AG+AAAXuhAAB
  (dictionary objn - 3933820, file - 446, block - 97185, slot - 1)

9. Repeat Test


To repeat test, exit both SESS-1 and SESS-2, open a third SESS-3, and register a new alert to cleanup alert_1, alert_2, alert_3. Then repeat above test steps.

exec dbms_alert.register('alert_other');