Il Locks Engine è un oggetto di tipo Data Engine che consente di gestire all'interno di un Package la sincronizzazione di accessi concorrenti a risorse e funzionalità.
Un caso tipico di utilizzo riguarda l'accesso in lettura e scrittura di due utenti ad uno stesso dataset. In particolare se entrambi si trovassero a lavorare sullo stesso record contemporaneamente, il secondo utente potrebbe sovrascrivere le modifiche effettuate dal primo. Per risolvere questo tipo di problemi è possibile definire:
✓ Lock in modalità condivisa (shared), che consentono l'accesso in lettura a più utenti;
✓ Lock esclusivi (exlusive), che garantiscono l'accesso in scrittura ad un solo utente alla volta.
Molti utenti possono ottenere lock condivisi sulla stessa risorsa, mentre solo un utente può ottenere un lock esclusivo, nel momento in cui la risorsa non risulta utilizzata. |
IrionEDM consente di definire lock logici di tipo applicativo. Essi non bloccano fisicamente una risorsa (e.g. record, dataset o procedure), ma consentono di verificare l'effettiva disponibilità di accesso al dato, per l'utente corrente. In questo modo la gestione di accessi concorrenti ad oggetti del Package è completamente sotto il controllo di chi li ha realizzati.
E' possibile monitorare i lock attivi mediante l'oggetto Active Locks della classe SystemInfo. |
Gli aspetti definitori di un Locks Engine sono configurabili mediante i tab:
✓ Query, nel quale specificare i parametri dei lock desiderati;
✓ Columns, espone, con modalità analoghe ad ogni Data Link, la Column List.
Nel tab Query, è possibile specificare la query, per la definizione di un lock,
✓ manualmente, nell'editor di testo del tab oppure mediante il Query Builder (accessibile con il pulsante Builder );
✓ graficamente, mediante il SQL Visual Editor (accessibile disattivando il Visual Mode con il pulsante ).
Inoltre, è possibile eseguire in anteprima il listato SQL mediante il pulsante Show Sql , presente nella toolbar corrente.
La definizione manuale della query può essere ulteriormente guidata, mediante un esempio predefinito, che può essere esposto nell'editor di testo con il tasto Sample . Tale query esemplificativa considera tutti i possibili elementi definitori di un lock, elencati nella seguente tabella.
Elemento |
Descrizione |
Default |
---|---|---|
Lock_Resource Name |
Nome logico della risorsa su cui sono posti i lock. E' obbligatorio in caso la Lock_Action sia 'acquire'. |
'res1' |
Lock_Resource Solution |
Nome della soluzione (opzionale). Consente di raggruppare più lock, sotto un nome comune, in caso essi siano definiti in Package differenti. |
'' |
Lock_Info |
Descrizione opzionale del lock. |
'' |
Lock_Timeout |
Timeout del lock espresso in secondi (opzionale). Rappresenta il tempo di attesa per un lock non disponibile, prima di restituire errore. |
0 |
Lock_Action |
L'azione da eseguire in caso la risorsa sia disponibile (opzionale). E' possibile acquisire il lock ('a' o 'acquire') o rilasciarlo ('r' o 'release'). |
'a' |
Lock_FailureAction |
L'azione da eseguire quando la Lock_Action fallisce (opzionale). E' possibile ottenere la restituzione di un errore ('e' o 'error') o proseguire l'esecuzione senza acquisire/rilasciare il lock ('c' o 'continue'). |
'e' |
Lock_Mode |
Modalità di acquisizione del lock (opzionale). E' possibile acquisire la risorsa in modo esclusivo ('exclusive','e' o 'x') o in condivisione ('share' o 's'). |
's' |
Lock_Failure MessageFormat |
Struttura del messaggio d'errore, visualizzato in output in caso di fallimento della Lock_Action. In caso non sia specificato viene mostrato un messaggio d'errore generico. |
'' |
Lock_Common |
Consente di impostare l'eventuale riutilizzo di un lock acquisito in modalità 'share' (opzionale). |
'true' |
Lock_Owner |
Consente di impostare la modalità di rilascio automatico di un lock, legandola ad un evento. |
|
Lock_Id |
Numero identificativo del lock. E' obbligatorio in caso la Lock_Action sia 'release'. |
'-1' |
Nel caso in cui la query, definente i parametri del lock, restituisca campi non presenti nella precedente tabella, essi vengono ignorati. |
Un Lock Engine, come ogni Data Engine, è eseguito quando viene ingaggiato in una specifica elaborazione. Essa può essere associata:
✓ all’esecuzione del primo Chapter marcato come Autostart;
✓ alla partenza di un Book
✓ all’esecuzione ingaggiata da un Command Run Chatpter.
Associare un Owner ad un lock consente di specificare quando avviene il rilascio automatico di quest'ultimo. In particolare, gli Owner disponibili sono:
✓ Execution, il rilascio avviene al termine dell'elaborazione dell'oggetto nel quale il Locks Engine è coinvolto;
✓ Chapter, il rilascio avviene al termine dell'esecuzione di un Chapter o quando l’intero Book viene chiuso. oppure al termine dell'esecuzione del Workflow;
✓ Book, il rilascio avviene alla chiusura del Book;
✓ Session, il rilascio avviene quando l'applicazione viene chiusa, l'utente cambia Catalog, oppure al temine del Workflow associato alla sessione applicativa corrente.
Rispetto a versioni precedenti della piattaforma, è stata eliminata l’ownership di tipo Package, sostituibile – a seconda dei casi – con Book o Session. |
In caso due processi condividano la stessa sessione, un rilascio di tipo Session avviene al termine di tutti i processi coinvolti. |
Il Lock_FailureMessageFormat consente di specificare la struttura del messaggio d'errore in output mediante l'utilizzo dei place-holder descritti nella seguente tabella.
Place-holder |
Descrizione |
---|---|
%USERNAME% |
Nome dell'utente che detiene il lock. |
%HOSTNAME% |
Nome del client che detiene il lock. |
%RESNAME% |
Nome della risorsa su cui è posto il lock. |
%RESSOL% |
Nome della soluzione che raggruppa i lock definiti. |
%PACKNAME% |
Nome del Package che detiene il lock. |
%EXTINFO% |
Messaggio che specifica quanti lock sono stati acquisiti per ciascuna risorsa. |
%MODE% |
Modalità di esecuzione del lock. |
%PROGNAME% |
Nome dell'applicazione che detiene il lock (IrionDQ.UI o IrionDQ.JobExecutor). |
%SESSION% |
Identificativo della sessione che detiene il lock. |
%ENTYNAME% |
Nome dell'oggetto del Package che detiene il lock. |
%EXECUTION% |
Identificativo dell'esecuzione che detiene il lock. |
%DATE% |
Data di acquisizione del lock. |
%INFO% |
Descrizione del lock che espone il campo Lock_Info. |
%STATUS% |
Stato della Lock_Action. |
Il tab Columns si comporta in modo analogo al corrispettivo tab di un qualsiasi Data Link. Tuttavia la Column List di un Lock Engine si compone di almeno tre campi di default, creati in automatico dal sistema:
✓ Lock_Id, il numero identificativo del lock. E' un numero auto-incrementale che identifica in modo univoco il lock corrente. Tale campo assume il valore -1 in caso il lock non sia valido o la sua acquisizione fallisca.
✓ Lock_Status, specifica il risultato dell'azione richiesta sul lock. Assume valore 1 in caso di successo (lock acquisito o rilasciato) o 0 in caso di fallimento.
✓ Lock_Message espone l'eventuale messaggio d'errore, definito nel campo Lock_FailureMessageFormat.
I Locks Engine dispongono di ulteriori proprietà di visualizzazione non esposte direttamente nella corrispondente UI. Per configurarle è possibile utilizzare il visualizzatore della Property Grid (tasto F4).
Le principali properties avanzate di un Locks Engine sono:
✓ Missing Column Behavior, determina il comportamento in caso di colonne mancanti (Restituire errore o valorizzare a NULL);
✓ Unexpected Columns, determina il comportamento in caso di colonne inattese (ignorare, leggere o restituire errore);
✓ Null On Data Error, restituisce NULL in caso di errore su un DataType atteso.
APPROFONDIMENTI E ARGOMENTI CORRELATI