Skip to main content

Lock

Il package DBMS_LOCK permette di accedere ai servizi del sistema di gestione dei lock di Oracle. Si può richiedere un lock con una marticolare modalità di condivisione, fornendogli un particolare nome per riferirvi in altre procedure per cambiare il lock mode oppure rilasciarlo.

Alcuni utilizzi:

  • Forzare accesso esclusivo ad un device particolare, come un terminal
  • Rilevare quando un lock viene rilasciato ed effetture eventuali operazioni di pulizia
  • Sincronizzare le applicazioni e forzare esecusioni sequenziali

Oracle Online Docs

Non serve per lavorare sui lock già presenti nel sistema.

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;