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;