Skip to main content
 

Evitare di restare in attesa con ORA-00054: risorsa occupata

L'errore in questione, Oracle ORA-00054: resource busy and acquire with NOWAIT specified  (in italiano, ORA-00054: risorsa occupata, acquisizione con NOWAIT specificato o timeout scaduto), viene lanciato quando si tenta di acquisire un lock su una risorsa in modalità NOWAIT, e la risolrsa risulta già loccata da un altra sessione. Senza NOWAIT il codice resterebbe bloccato in attesa del rilascio del lock. Con NOWAIT il codice non si blocca e scatena l'eccezione.

Intercettare l'errore con un blocco exception è molto semplice, e vi permette di gestire la mancata acquisizione del lock in modo pulito:

DECLARE
  resource_busy EXCEPTION;
  PRAGMA EXCEPTION_INIT(resource_busy, -54);
BEGIN
   ...
   select {column_list} from {table_name} where {where_clause} for update nowait;
   ....
EXCEPTION
WHEN resource_busy THEN
  /*
* Il codice di gestione
* della mancata acquisizione del lock va qui
*/ END;

Oracle, Lock