DEFTRANSACTION
La specifica definisce un'unità di lavoro (aggiornamento) sulla base dati, seguendo i passi:
- crea la transazione sul database specificato (esegue l'istruzione BEGIN TRANSACTION);
- esegue la call back GESTIONEDATI, deputata alle operazioni di aggiornamento della base dati;
- completa le operazioni di aggiornamento (esegue l'istruzione COMMIT).
Nel caso di errore, l'ambiente o il programma può interrompere la transazione eseguendo la specifica @ROLLBACKTRANSACTION. In questo caso l'ambiente non esegue l'operazione di COMMIT al termine della routine di aggiornamento dati.
Nel caso due o più transazioni siano in competizione per l'accesso e l'utilizzo di record/tabelle in comune, è possibile che si verifichi il fenomeno denominato 'DEADLOCK'. Questa situazione provoca l'interruzione di una (o più) delle transazioni coinvolte ed indica uno stallo rilevato dal gestore della base dati, dove nessuna delle transazioni procede.
Deadlock e configurazione siscfg.ini Il deadlock non è un errore che può essere eliminato a priori e dipende dalla particolare sequenza temporale di esecuzione delle transazioni. È possibile intercettare l'errore di avvenuto deadlock specificando una call back tramite l'attributo GESTIONEDEADLOCK. In questa call back si può richiamare il metodo BCDatabaseInfo.SetRetryTransaction per ripetere l'aggiornamento, ripetendo la sequenza di creazione della transazione, esecuzione della call back GESTIONEDATI, completamento della transazione.
L'evento di deadlock è registrato sul file siserr.log, con un messaggio simile al seguente: 'Si è verificato un errore di deadlock (procedura %s sorgente %s linea %d, specifica %s). Tentativo %d\n' E' possibile modificare la registrazione degli eventi sul file SISERR.LOG, impostando la soglia di rilevamento dell'evento:
Parametri
| Parametro | Definizione | I/O | Versione traduttore | SMP | |
|---|---|---|---|---|---|
| GESTIONEDATI | Azione | ||||
| GESTIONEDEADLOCK | Azione | ||||
| LIVELLOISOLAMENTO | Enumerazione | ||||
| ERRORE | Intero |
GESTIONEDATI
Callback eseguita contenente le operazioni di aggiornamento dei dati sotto transazione.
GESTIONEDEADLOCK
Callback eseguita in caso di DEADLOCK.
In questa callback si può richiamare il metodo BCDatabaseInfo.SetRetryTransaction per ripetere l'aggiornamento, ripetendo l'esecuzione della callback GESTIONEDATI, e la COMMIT a completamento della transazione.
Da versione 31.1 non è più necessario richiamare il metodo BCDatabaseInfo.SetRetryTransaction perché l'ambiente effettua comunque 3 tentativi a fronte di un deadlock.
LIVELLOISOLAMENTO
Permette di definire il livello di isolamento della transazione. Se non specificato, il valore di default è #COMMIT_READ
Al termine della transazione il livello di isolamento è ripristinato al suo valore precedente.
Parametro enumerato, può assumere i seguenti valori:
| Valore | Descrizione |
|---|---|
UNCOMMITTED_READ | |
COMMIT_READ | |
REPETEABLE_READ | |
SERIALIZABLE |
ERRORE
Consente al programma di intercettare e gestire l'errore restituito dalla funzione.
Utilizzare uno dei metodi GetLastError*() della classe BCContextInfo per ottenere le informazioni dell'errore.
Esempi
Definizione
'@DEFTRANSACTION GESTIONEDATI[OperationsOnDB()] _
GESTIONEDEADLOCK[DeadlockManagement()]