IBM i: Database Controllo del commit

annuncio pubblicitario
IBM i
Database
Controllo del commit
Versione 7 Release 1
IBM i
Database
Controllo del commit
Versione 7 Release 1
Nota
Prima di utilizzare le presenti informazioni e il prodotto da esse supportato, leggere le
informazioni contenute nella sezione “Informazioni particolari”, a pagina 123.
Questa edizione si applica a IBM i 7.1 (numero prodotto 5770-SS1) e a tutti i release e livelli di modifica successivi,
a meno che non venga diversamente indicato nelle nuove edizioni. La presente versione non viene eseguita su tutti
i modelli RISC (reduced instruction set computer) né sui modelli CISC.
© Copyright IBM Corporation 2003, 2010.
Indice
Controllo del commit . . . . . . . . . 1
Novità in IBM i 7.1 . . . . . . . . . . . . 1
File PDF per il controllo del commit . . . . . . 1
Concetti di controllo del commit . . . . . . . . 2
Modalità di funzionamento del controllo del
commit . . . . . . . . . . . . . . . 2
Modalità di funzionamento delle operazioni di
commit e di rollback . . . . . . . . . . . 3
Operazione di commit . . . . . . . . . 3
Operazione di rollback . . . . . . . . . 4
Definizione di commit . . . . . . . . . . 5
Ambito per una definizione di commit . . . 6
Nomi di definizioni di commit . . . . . . 9
Esempio: lavori e definizioni di commit . . . 10
Modalità di funzionamento del controllo del
commit con gli oggetti. . . . . . . . . . 12
Tipi di risorse di cui è possibile eseguire il
commit . . . . . . . . . . . . . . 12
Risorse di cui è possibile eseguire il commit
locali e remote . . . . . . . . . . . 15
Intento di accesso di una risorsa di cui è
possibile eseguire il commit . . . . . . . 15
Protocollo di commit di una risorsa di cui è
possibile eseguire il commit . . . . . . . 16
File registrati su giornale e controllo del
commit . . . . . . . . . . . . . . 17
Sequenza di voci di giornale sotto il controllo
del commit . . . . . . . . . . . . 17
Identificativo di ciclo di commit . . . . . 20
Blocco di record . . . . . . . . . . . 21
Controllo del commit e lotti dischi indipendenti 22
Considerazioni sui lotti dischi indipendenti
per le definizioni di commit . . . . . . . 22
Considerazioni per le transazioni XA . . . . 25
Considerazioni e limitazioni per il controllo del
commit . . . . . . . . . . . . . . . 25
Controllo del commit per le applicazioni batch
27
Controllo del commit in due fasi . . . . . . 28
Ruoli nell'elaborazione di commit . . . . . 29
Stati della transazione per il controllo del
commit a due fasi . . . . . . . . . . 31
Definizioni di commit per il controllo del
commit in due fasi . . . . . . . . . . 34
Definizione di commit per un commit in
due fasi: consentire VRO (vote read-only) . 35
Definizione di commit per un commit in
due fasi: Non attendere risultato . . . . 37
Definizione di commit per un commit in
due fasi: indicazione di OK tralasciare . . 41
Definizione di commit per un commit in
due fasi: non selezione di un ultimo agent . 43
Effetto della decisione affidabile sul flusso
di elaborazione di commit . . . . . . 44
Supporto delle transazioni XA per il controllo del
commit . . . . . . . . . . . . . . . 46
© Copyright IBM Corp. 2003, 2010
Modalità server SQL e transazioni nell'ambito del
sottoprocesso per il controllo del commit . . . 51
Avvio del controllo del commit . . . . . . . . 52
Oggetto di notifica del commit . . . . . . . 53
Livello di blocco del commit. . . . . . . . 55
Terminazione del controllo del commit . . . . . 58
Terminazione avviata dal sistema del controllo del
commit . . . . . . . . . . . . . . . . 59
Controllo del commit durante la fine del gruppo
di attivazione . . . . . . . . . . . . . 59
Operazioni di commit e di rollback impliciti . . 60
Controllo del commit durante la terminazione
normale del passo di instradamento . . . . . 63
Controllo del commit durante la fine anomala di
lavoro o sistema . . . . . . . . . . . . 64
Aggiornamenti all'oggetto di notifica . . . . . 65
Ripristino del controllo del commit durante l'IPL
(initial program load) dopo la fine anomala . . 67
Gestione di transazioni e controllo del commit. . . 69
Visualizzazione delle informazioni sul controllo
del commit . . . . . . . . . . . . . 69
Visualizzazione di oggetti bloccati per una
transazione . . . . . . . . . . . . 70
Visualizzazione di lavori associati a una
transazione . . . . . . . . . . . . 70
Visualizzazione dello stato risorsa di una
transazione . . . . . . . . . . . . 71
Visualizzazione delle proprietà delle
transazioni . . . . . . . . . . . . 71
Ottimizzazione delle prestazioni per il controllo
del commit . . . . . . . . . . . . . 71
Riduzione al minimo dei blocchi . . . . . 74
Gestione della dimensione della transazione
75
Commit soft . . . . . . . . . . . . 77
Scenari ed esempi: controllo del commit . . . . . 78
Scenario: controllo del commit . . . . . . . 78
Problema pratico per il controllo del commit . . 81
Flusso logico per l'esercizio pratico . . . . 87
Passi associati al flusso logico per il
programma pratico . . . . . . . . . . 89
Esempio: utilizzo di un file di registrazione delle
transazioni per avviare un'applicazione . . . . 90
Esempio: utilizzo di un oggetto di notifica per
avviare un'applicazione . . . . . . . . . 94
Esempio: oggetto di notifica univoco per
ciascun programma. . . . . . . . . . 96
Esempio: oggetto di notifica singolo per tutti
i programmi. . . . . . . . . . . . 100
Esempio: utilizzo di un programma di
elaborazione standard per avviare
un'applicazione. . . . . . . . . . . . 101
Esempio: codice per un programma di
elaborazione standard . . . . . . . . 101
Flusso di elaborazione . . . . . . . 103
Esempio: codice per un programma di
elaborazione di commit standard . . . . . 104
iii
Esempio: utilizzo di un programma di
elaborazione standard per decidere se
riavviare l'applicazione . . . . . . .
Risoluzione dei problemi relativi a transazioni e
controllo del commit . . . . . . . . . .
Errori del controllo del commit . . . . .
Condizioni di errore . . . . . . . .
Condizioni senza errori . . . . . . .
Messaggi di errore da monitorare durante il
controllo del commit . . . . . . . .
Monitoraggio del verificarsi di errori dopo
un comando CALL . . . . . . . .
Errore di elaborazione di commit o rollback
normale . . . . . . . . . . . .
Rilevazione di condizioni di stallo . . . .
iv
IBM i: Database Controllo del commit
. 106
.
.
.
.
107
107
108
109
|
|
Ripristino delle transazioni dopo un errore nelle
comunicazioni . . . . . . . . . . . .
Quando forzare le opzioni di commit e di
rollback e quando annullare la
risincronizzazione . . . . . . . . . . .
Fine di un rollback a lunga esecuzione . . . .
Ricerca di transazioni di grandi dimensioni
oppure obsolete . . . . . . . . . . .
Informazioni correlate per il controllo del commit
116
117
118
119
120
. 110
. 113
. 113
. 115
Appendice. Informazioni particolari
123
Informazioni sull'interfaccia di programmazione
Marchi . . . . . . . . . . . . . .
Termini e condizioni . . . . . . . . . .
125
. 125
. 125
Controllo del commit
Il controllo del commit è una funzione che assicura l'integrità dei dati. Definisce ed elabora un gruppo di
modifiche alle risorse, come ad esempio le tabelle o i file di database, come una transazione.
Il controllo del commit assicura che l'intero gruppo di modifiche individuali venga eseguito su tutti i
sistemi che partecipano alla transazione oppure che non venga eseguita nessuna delle modifiche. DB2 for
IBM® i utilizza la funzione di controllo del commit per eseguire il commit e il rollback delle transazioni di
database in esecuzione con un livello di isolamento diverso da *NONE (nessun commit).
È possibile utilizzare il controllo del commit per progettare un'applicazione in modo che il sistema possa
riavviare l'applicazione se un lavoro, un gruppo di attivazione in un lavoro o il sistema vengono
terminati in modo anomalo. Il controllo del commit consente di garantire che, quando l'applicazione
viene avviata nuovamente, nel database non siano presenti degli aggiornamenti parziali dovuti a
transazioni incomplete dovute a un precedente malfunzionamento.
Nota: utilizzando gli esempi di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
Novità in IBM i 7.1
Questa sezione contiene informazioni nuove o modificate in modo significativo per la raccolta di
argomenti Controllo del commit.
v Supporto per le transazioni di controllo del commit che possono estendersi a un IASP (Independent
ASP) e *SYSBAS senza utilizzare una connessione remota (consultare le sezioni Considerazioni su
Impostazione gruppo ASP e Considerazioni su IPL (initial program load) e disattivazione in
Considerazioni sui lotti dischi indipendenti per le definizioni di commit per informazioni dettagliate).
v Supporto per l'eliminazione di rami transazione XA orfani (consultare la sezione Considerazioni sul
ripristino in Supporto delle transazioni XA per il controllo del commit per informazioni dettagliate).
v Supporto per trovare transazioni di grandi dimensioni oppure obsolete (consultare Ricerca di
transazioni di grandi dimensioni oppure obsolete per informazioni dettagliate).
Come individuare le novità o le modifiche
Per facilitare l'individuazione dei punti in cui sono state apportate modifiche tecniche, queste
informazioni utilizzano:
per segnalare dove iniziano le informazioni nuove o modificate.
v L'immagine
per segnalare dove finiscono le informazioni nuove o modificate.
v L'immagine
Nei file PDF, vengono visualizzate delle barre (|) a sinistra delle informazioni nuove e modificate.
Per individuare ulteriori informazioni relative alle novità o alle modifiche, consultare l'argomento Memo
per gli utenti.
File PDF per il controllo del commit
È possibile visualizzare e stampare un file PDF che contiene le presenti informazioni.
Per visualizzare o scaricare la versione PDF di questo documento, selezionare Controllo del commit (circa
1361 KB).
© Copyright IBM Corp. 2003, 2010
1
Salvataggio di file PDF
Per salvare un PDF sulla stazione di lavoro per la visualizzazione o per la stampa:
1. Fare clic con il tasto destro del mouse sul collegamento PDF nel proprio browser.
2. Selezionare l'opzione che effettua il salvataggio locale del PDF.
3. Andare all'indirizzario in cui si desidera salvare il PDF.
4. Fare clic su Salva.
Scaricamento di Adobe Reader
Per visualizzare o stampare tali PDF, è necessario che sul sistema sia installato Adobe® Reader. È possibile
.
scaricare una copia gratuita dal sito Web Adobe (www.adobe.com/products/acrobat/readstep.html)
Riferimenti correlati
“Informazioni correlate per il controllo del commit” a pagina 120
I manuali dei prodotti, le pubblicazioni IBM Redbooks, i siti Web e altre raccolte di argomenti
dell'information center contengono informazioni correlate alla raccolta di argomenti Controllo del commit.
È possibile visualizzare o stampare qualsiasi file PDF.
Concetti di controllo del commit
Questi concetti di controllo del commit aiutano a comprendere come funziona il controllo del commit,
come interagisce con il sistema e come interagisce con gli altri sistemi nella rete.
Modalità di funzionamento del controllo del commit
Il controllo del commit assicura che l'intero gruppo di modifiche individuali venga applicato su tutti i
sistemi partecipanti oppure che non venga applicata alcuna modifica.
Ad esempio, quando si trasferiscono dei fondi da un conto di risparmio a un conto corrente, viene
applicata più di una modifica come un gruppo. Per l'utente, questo trasferimento sembra essere una
singola modifica. Tuttavia, viene applicata più di una modifica al database perché vengono modificati sia
il conto di risparmio sia il conto corrente. Per fare in modo che entrambi i conti siano accurati, tutte le
modifiche o nessuna delle modifiche devono essere applicate al conto corrente e al conto di risparmio.
Il controllo del commit consente di completare le seguenti attività:
v Assicurarsi che tutte le modifiche in una transazione siano completate per tutte le risorse interessate.
v Assicurarsi che tutte le modifiche in una transazione vengano eliminate se l'elaborazione viene
interrotta.
v Rimuovere le modifiche apportate durante una transazione quando l'applicazione determina che una
transazione è in errore.
È anche possibile progettare un'applicazione in modo che il controllo del commit possa riavviare
l'applicazione se un lavoro, un gruppo di attivazione in un lavoro o il sistema vengono terminati in modo
anomalo. Il controllo del commit consente di garantire che, quando l'applicazione viene avviata
nuovamente, nel database non siano presenti degli aggiornamenti parziali dovuti a transazioni
incomplete dovute a un precedente malfunzionamento.
Transazione
Una transazione è un gruppo di singole modifiche agli oggetti sul sistema che si presenta all'utente come
una singola modifica "atomica" (ossia indivisibile).
2
IBM i: Database Controllo del commit
Nota: System i Navigator utilizza il termine transazione, mentre l'interfaccia basata sui caratteri utilizza il
termine LUW (logical unit of work o unità di lavoro logica). I due termini sono intercambiabili. Questo
argomento, a meno che non faccia specificamente riferimento all'interfaccia basata sui caratteri,
utilizza il termine transazione.
Una transazione può essere una delle seguenti situazioni:
Interrogazioni in cui non si verifica alcuna modifica del file di database.
Semplici transazioni che modificano un singolo file di database.
Transazioni complesse che modificano uno o più file di database.
Transazioni complesse che modificano uno o più file di database, ma queste modifiche rappresentano
solo una parte di un gruppo logico di transazioni.
v Transazioni semplici e complesse che interessano i file di database su più di una singola ubicazione. I
file di database possono essere in una delle seguenti situazioni:
– Su un sistema remoto singolo.
v
v
v
v
– Sul sistema locale e uno o più sistemi remoti.
– Assegnato a più di un giornale sul sistema locale. Ciascun giornale può essere considerato come
un'ubicazione locale.
v Transazioni semplici o complesse sul sistema locale che interessano oggetti diversi dai file di database.
Modalità di funzionamento delle operazioni di commit e di rollback
Le operazioni di commit e di rollback interessano le modifiche apportate sotto il controllo del commit.
I seguenti linguaggi di programmazione e le seguenti API (application programming interface)
supportano le operazioni di commit e di rollback.
Linguaggio o API
Commit
Rollback
CL
Comando COMMIT
Comando ROLLBACK
IBM ILE (Integrated Language
Environment) RPG
Codice operazione COMIT
Codice operazione ROLBK
ILE COBOL
Verbo COMMIT
Verbo ROLLBACK
ILE C
Funzione _Rcommit
Funzione _Rrollbck
PLI
Sottoroutine PLICOMMIT
Sottoroutine PLIROLLBACK
SQL
Istruzione COMMIT
Istruzione ROLLBACK
SQL CLI (Call Level Interface)
Funzione SQLTransact() (Viene utilizzata per eseguire il commit e il rollback
di una transazione)
API XA
API xa_commit() e db2xa_commit()
API xa_rollback() e db2xa_rollback()
Concetti correlati
SQL call level interface
Database programming
Informazioni correlate
PDF del manuale WebSphere Development Studio: ILE C/C++ Programmer's Guide
CL programming
Application programming interfaces
Operazione di commit
Un'operazione di commit rende permanenti tutte le modifiche eseguite sotto il controllo del commit dopo
la precedente operazione di commit o rollback. Il sistema rilascia anche tutti i blocchi correlati alla
transazione.
Controllo del commit
3
Quando riceve una richiesta di esecuzione di un commit, il sistema esegue le seguenti operazioni:
v Il sistema salva l'identificazione di commit, se ne viene fornita una, per l'utilizzo al momento del
ripristino.
v Il sistema scrive i record nel file prima di eseguire l'operazione di commit se ricorrono entrambe le
condizioni qui di seguito indicate:
– I record sono stati aggiunti a un file di database locale o remoto sotto il controllo del commit.
– SEQONLY(*YES) è stato specificato quando il file è stato aperto in modo che il sistema utilizzi il
feedback I/E bloccato ed esista un blocco parziale di record.
Altrimenti, l'area di feedback I/E e i buffer I/E non vengono modificati.
v Il sistema esegue una chiamata al programma di uscita di rollback e di commit per ciascuna risorsa di
commit API presente nella definizione di commit. Se per un'ubicazione è registrato più di un
programma di uscita, il sistema richiama i programmi di uscita per tale ubicazione nell'ordine in cui
erano stati registrati.
v Se sono state eseguite delle modifiche di record per le risorse assegnate a un giornale, il sistema scrive
una voce di giornale C CM in ogni giornale locale associato alla definizione di commit. La sequenza di
voci di giornale sotto il controllo del commit mostra le voci di norma scritte mentre è attiva una
definizione di commit.
v Il sistema rende permanenti le modifiche a livello di oggetto in sospeso.
v Il sistema sblocca i blocchi di record e oggetto acquisiti e mantenuti per scopi di controllo del commit.
Queste risorse sono rese disponibili ad altri utenti.
v Il sistema modifica le informazioni nella definizione di commit per mostrare che la transazione corrente
è stata terminata.
Il sistema deve eseguire tutti i passi precedenti correttamente perché l'operazione di commit abbia esito
positivo.
Concetti correlati
“Definizione di commit” a pagina 5
La definizione di commit contiene informazioni pertinenti alle risorse di cui è in corso la modifica sotto il
controllo del commit durante una transazione.
“Sequenza di voci di giornale sotto il controllo del commit” a pagina 17
Questa tabella mostra la sequenza di voci di norma scritte mentre è attiva una definizione di commit. È
possibile utilizzare il programma di ricerca delle informazioni sulle voci del giornale per ottenere ulteriori
informazioni sul contenuto delle voci di giornale.
Operazione di rollback
Un'operazione di rollback elimina tutte le modifiche apportate dopo la precedente operazione di commit
o rollback. Il sistema rilascia anche tutti i blocchi correlati alla transazione.
Il sistema esegue le seguenti operazioni quando riceve una richiesta di esecuzione di un rollback:
v Il sistema elimina i record dal buffer I/E se ricorrono entrambe queste condizioni:
– Se i record sono stati aggiunti a un file di database locale o remoto sotto il controllo del commit.
– Se SEQONLY(*YES) è stato specificato quando il file è stato aperto in modo che il sistema utilizzi
l'I/E bloccato ed esista un blocco parziale di record che non è stato ancora scritto nel database.
Altrimenti, l'area di feedback I/E e i buffer I/E rimangono invariati.
v Il sistema esegue una chiamata al programma di uscita di rollback o di commit per ciascuna risorsa di
commit API presente nella definizione di commit. Se per un'ubicazione è registrato più di un
programma di uscita, il sistema richiama i programmi di uscita per tale ubicazione in ordine inverso
rispetto a quello in cui erano stati registrati.
v Se un record è stato eliminato da un file, il sistema aggiunge nuovamente il record al file.
v Il sistema rimuove le eventuali modifiche ai record che sono state eseguite durante questa transazione
e rimette i record originali (le immagini-precedenti) nel file.
4
IBM i: Database Controllo del commit
v Se dei record sono stati aggiunti al file durante questa transazione, rimangono nel file come record
cancellati.
v Se sono state eseguite delle modifiche di record per le risorse assegnate a un giornale durante la
transazione, il sistema aggiunge una voce di giornale di C RB al giornale, indicando che si è verificata
un'operazione di rollback. Il giornale contiene anche immagini delle modifiche di record di cui è stato
eseguito il rollback. Prima che venisse richiesta l'operazione di rollback. le immagini-precedenti e le
immagini-successive dei record modificati erano state inserite nel giornale. Il sistema scrive anche la
voce C RB nel giornale predefinito se a tale giornale è assegnata qualche risorsa di cui è possibile
eseguire il commit.
v Il sistema posiziona i file aperti sotto il controllo del commit a una delle seguenti posizioni:
– L'ultimo record cui è stato eseguito l'accesso nella transazione precedente
– Alla posizione di apertura se non è stata eseguita alcuna operazione di commit per il file utilizzando
questa definizione di commit
Questa considerazione è importante se si sta eseguendo un'elaborazione sequenziale.
v Il sistema non esegue il rollback delle modifiche di cui non è possibile eseguire il commit per i file di
database. Ad esempio, i file aperti non vengono chiusi e i file cancellati non vengono ripristinati. Il
sistema non riapre o riposiziona i file chiusi durante questa transazione.
v Il sistema sblocca i blocchi di record acquisiti per scopi di controllo del commit e rende questi record
disponibili ad altri utenti.
v L'identificazione di commit attualmente salvata dal sistema rimane uguale all'identificazione di commit
fornita con l'ultima operazione di commit per la stessa definizione di commit.
v Il sistema inverte le, o esegue il rollback delle, modifiche di cui è possibile eseguire il commit a livello
di oggetto eseguite durante questa transazione.
v I blocchi di oggetto acquisiti per scopi di controllo del commit vengono sbloccati e tali oggetti vengono
resi disponibili ad altri utenti.
v Il sistema stabilisce il limite di commit precedente come limite di commit corrente.
v Il sistema modifica le informazioni nella definizione di commit per mostrare che la transazione corrente
è stata terminata.
Il sistema deve eseguire tutti i passi precedenti correttamente perché l'operazione di rollback abbia esito
positivo.
Definizione di commit
La definizione di commit contiene informazioni pertinenti alle risorse di cui è in corso la modifica sotto il
controllo del commit durante una transazione.
Per creare una definizione di commit, utilizzare il comando STRCMTCTL (Avvio controllo commit) per
avviare il controllo del commit sul sistema. Inoltre, DB2 for i crea automaticamente una definizione di
commit quando il livello di isolamento è diverso da *NONE (nessun commit).
Il sistema conserva le informazioni di controllo del commit nella definizione di commit mentre le risorse
di commit vengono modificate fino al termine della definizione di commit. Ciascuna transazione attiva
sul sistema è rappresentata da una definizione di commit. Una transazione successiva può riutilizzare
una definizione di commit dopo ciascun commit o rollback di una transazione attiva.
Una definizione di commit di norma include le seguenti informazioni:
v I parametri del comando STRCMTCTL.
v Lo stato corrente della definizione di commit.
v Le informazioni sui file di database e altre risorse di cui è possibile eseguire il commit che contengono
modifiche eseguite durante la transazione corrente.
Controllo del commit
5
Per le definizioni di commit con blocchi nell'ambito del lavoro, solo il lavoro che avvia il controllo del
commit conosce tale definizione di commit. Nessun altro lavoro conosce tale definizione di commit.
I programmi possono avviare e utilizzare più definizioni di commit. Ciascuna definizione di commit per
un lavoro identifica una transazione separata cui sono associate delle risorse di cui è possibile eseguire il
commit. È possibile eseguire il commit o il rollback di queste transazioni indipendentemente dalle
transazioni associate ad altre definizioni di commit avviate per il lavoro.
Concetti correlati
“Operazione di commit” a pagina 3
Un'operazione di commit rende permanenti tutte le modifiche eseguite sotto il controllo del commit dopo
la precedente operazione di commit o rollback. Il sistema rilascia anche tutti i blocchi correlati alla
transazione.
“Controllo del commit e lotti dischi indipendenti” a pagina 22
I lotti dischi indipendenti e i gruppi di lotti dischi indipendenti possono ognuno avere un database i5/OS
separato. È possibile utilizzare il controllo del commit con questi database.
“Considerazioni sui lotti dischi indipendenti per le definizioni di commit” a pagina 22
Quando si utilizzano i lotti dischi indipendenti, è necessario tenere presenti le seguenti considerazioni per
le definizioni di commit.
Ambito per una definizione di commit
L'ambito di una definizione di commit determina quali programmi utilizzano questa definizione di
commit e in che modo viene definito l'ambito dei blocchi acquisiti durante le transazioni.
L'interfaccia che avvia la definizione di commit determina l'ambito della definizione di commit. Gli
ambiti possibili per una definizione di commit sono quattro e rientrano in due categorie generali:
Definizioni di commit con blocchi nell'ambito del lavoro
v Definizione di commit a livello di gruppo di attivazione
v Definizione di commit a livello di lavoro
v Definizione di commit denominata esplicitamente
Definizioni di commit con blocchi nell'ambito della transazione
v Definizione di commit nell'ambito della transazione
Le definizioni di commit con blocchi nell'ambito del lavoro possono essere utilizzate solo dai programmi
che vengono eseguiti nel lavoro che ha avviato le definizioni di commit. Al confronto, più di un lavoro
può utilizzare le definizioni di commit con i blocchi nell'ambito della transazione.
Le applicazioni di norma utilizzano le definizioni di commit a livello di gruppo di attivazione o a livello
di lavoro. Queste definizioni di commit vengono create esplicitamente con il comando STRCMTCTL
(Avvio controllo commit) oppure implicitamente dal sistema quando un'applicazione SQL viene eseguita
con un livello di isolamento diverso da *NONE.
Definizione di commit a livello di gruppo di attivazione
L'ambito più comune è quello del gruppo di attivazione. La definizione di commit a livello di gruppo di
attivazione è l'ambito predefinito quando il comando STRCMTCTL avvia esplicitamente la definizione di
commit o quando un'applicazione SQL eseguita con un livello di isolamento diverso da *NONE (nessun
commit) avvia implicitamente la definizione di commit. Solo i programmi eseguiti in tale gruppo di
attivazione utilizzano questa definizione di commit. Per un lavoro, possono essere attive molte definizioni
di commit a livello di gruppo di attivazione alla volta. Tuttavia, ciascuna definizione di commit a livello
di gruppo di attivazione può essere associata solo a un singolo gruppo di attivazione. I programmi
eseguiti in tale gruppo di attivazione possono associare le loro modifiche di cui è possibile eseguire il
commit solo a tale definizione di commit a livello di gruppo di attivazione.
6
IBM i: Database Controllo del commit
Quando System i Navigator, il comando WRKCMTDFN (Gestione definizioni di commit), il comando
DSPJOB (Visualizzazione lavoro) o il comando WRKJOB (Gestione lavoro) visualizzano una definizione di
commit a livello di gruppo di attivazione, questi campi visualizzano le seguenti informazioni:
v Il campo della definizione di commit visualizza il nome del gruppo di attivazione. Mostra il valore
speciale *DFTACTGRP per indicare il gruppo di attivazione predefinito.
v Il campo del gruppo di attivazione visualizza il numero del gruppo di attivazione.
v Il campo del lavoro visualizza il lavoro che ha avviato la definizione di commit.
v Il campo del sottoprocesso visualizza *NONE.
Definizione di commit a livello di lavoro
Una definizione di commit può essere inclusa nell'ambito del lavoro solo immettendo STRCMTCTL
CMTSCOPE (*JOB). Qualsiasi programma in esecuzione in un gruppo di attivazione per cui non è stata
avviata una definizione di commit a livello di gruppo di attivazione utilizza la definizione di commit a
livello di lavoro, se è già stata avviata da un altro programma per il lavoro. È possibile avviare solo una
singola definizione di commit a livello di lavoro per un lavoro.
Quando System i Navigator, il comando WRKCMTDFN (Gestione definizioni di commit), il comando
DSPJOB (Visualizzazione lavoro) o il comando WRKJOB (Gestione lavoro) visualizzano una definizione di
commit a livello di lavoro, questi campi visualizzano le seguenti informazioni:
v Il campo della definizione di commit visualizza il valore speciale *JOB.
v Il campo del gruppo di attivazione viene visualizzato vuoto.
v Il campo del lavoro visualizza il lavoro che ha avviato la definizione di commit.
v Il campo del sottoprocesso visualizza *NONE.
Per uno specifico gruppo di attivazione, i programmi eseguiti in tale gruppo di attivazione possono
utilizzare solo una singola definizione di commit. Pertanto, i programmi eseguiti in un gruppo di
attivazione possono utilizzare la definizione di commit a livello di lavoro o quella a livello di gruppo di
attivazione, ma non entrambe contemporaneamente. In un lavoro a più sottoprocessi che non utilizza la
modalità server SQL, il lavoro transazionale per un programma viene incluso nell'ambito dell'appropriata
definizione di commit rispetto al gruppo di attivazione del programma, indipendentemente da quale
sottoprocesso lo esegue. Se più sottoprocessi utilizzano lo stesso gruppo di attivazione, devono cooperare
per eseguire il lavoro transazionale e assicurare che i commit e i rollback si verifichino al momento
giusto.
Anche quando la definizione di commit a livello di lavoro è attiva per il lavoro, un programma può
comunque avviare la definizione di commit a livello di gruppo di attivazione se nessun programma in
esecuzione in tale gruppo di attivazione ha eseguito operazioni o richieste di controllo del commit per la
definizione di commit a livello di lavoro. Altrimenti, occorre prima terminare la definizione di commit a
livello di lavoro per potere quindi avviare la definizione di commit a livello di gruppo di attivazione. Le
seguenti operazioni o richieste di controllo del commit per la definizione di commit a livello di lavoro
possono impedire l'avvio della definizione di commit a livello di gruppo di attivazione:
v Apertura (piena o condivisa) di un file di database sotto il controllo del commit.
v Utilizzo dell'API QTNADDCR (Aggiunta risorsa di commit) per aggiungere una risorsa di commit API.
v Esecuzione del commit di una transazione.
v Esecuzione del rollback di una transazione.
v Aggiunta di una risorsa remota sotto il controllo del commit.
v Utilizzo dell'API QTNCHGCO (Modifica opzioni di commit) per modificare le opzioni di commit.
v Passaggio della definizione di commit a uno stato di rollback richiesto utilizzando l'API QTNRBRQD
(Rollback richiesto).
Controllo del commit
7
v Invio di una voce di giornale utente che include l'identificativo di ciclo di commit corrente utilizzando
l'API QJOSJRNE (Invio voce di giornale) con il parametro di inclusione dell'identificativo di ciclo di
commit.
In modo analogo, se i programmi in un gruppo di attivazione stanno attualmente utilizzando la
definizione di commit a livello di gruppo di attivazione, è necessario terminare prima la definizione di
commit perché poi i programmi in esecuzione nello stesso gruppo di attivazione possano utilizzare la
definizione di commit a livello di lavoro.
Quando si apre un file di database, l'ambito di apertura per il file aperto può essere al gruppo di
attivazione oppure al lavoro con una limitazione: se il programma sta aprendo un file sotto il controllo
del commit e il file viene incluso nell'ambito del lavoro, il programma che esegue la richiesta di apertura
deve utilizzare la definizione di commit a livello di lavoro.
Definizione di commit denominata esplicitamente
Le definizioni di commit denominate esplicitamente vengono avviate dal sistema quando deve eseguire
delle proprie transazioni di controllo del commit senza interessare le transazioni utilizzate da
un'applicazione. Un esempio di una funzione che avvia questi tipi di definizioni di commit è la
registrazione problemi. Un'applicazione non può avviare delle definizioni di commit denominate
esplicitamente.
Quando System i Navigator, il comando WRKCMTDFN (Gestione definizioni di commit), il comando
DSPJOB (Visualizzazione lavoro) o il comando WRKJOB (Gestione lavoro) visualizzano una definizione di
commit denominata esplicitamente, questi campi visualizzano le seguenti informazioni:
v Il campo di definizione di commit visualizza il nome ad essa assegnato dal sistema.
v Il campo del gruppo di attivazione viene visualizzato vuoto.
v Il campo del lavoro visualizza il lavoro che ha avviato la definizione di commit.
v Il campo del sottoprocesso visualizza *NONE.
Definizioni di commit nell'ambito della transazione
Le definizioni di commit nell'ambito della transazione vengono avviate con le API XA per i blocchi
nell'ambito della transazione.
Queste API utilizzano i protocolli di controllo del commit basati sui sottoprocessi o sulla connessione
SQL, e non quelli basati sul gruppo di attivazione. In altre parole, le API vengono utilizzate per associare
la definizione di commit a uno specifico sottoprocesso o a una specifica connessione SQL mentre viene
eseguito il lavoro transazionale e per eseguire il commit o il rollback delle transazioni. Il sistema collega
queste definizioni di commit ai sottoprocessi che eseguono il lavoro transazionale in base ai protocolli
API. Possono essere utilizzate dai sottoprocessi in lavori differenti.
Quando System i Navigator, il comando WRKCMTDFN (Gestione definizioni di commit), il comando
DSPJOB (Visualizzazione lavoro) o il comando WRKJOB (Gestione lavoro) visualizzano una definizione di
commit a livello della transazione, questi campi visualizzano le seguenti informazioni:
v Il campo della definizione di commit visualizza il valore speciale *TNSOBJ.
v Il campo del gruppo di attivazione viene visualizzato vuoto.
v Il campo del lavoro visualizza il lavoro che ha avviato la definizione di commit. Se invece la
definizione di commit è attualmente collegata a un sottoprocesso, viene visualizzato il lavoro del
sottoprocesso.
v Il campo relativo al sottoprocesso visualizza il sottoprocesso al quale è collegata la definizione di
commit (oppure *NONE, se la definizione di commit non è attualmente collegata ad alcun
sottoprocesso).
8
IBM i: Database Controllo del commit
Riferimenti correlati
XA APIs
Nomi di definizioni di commit
Il sistema attribuisce dei nomi a tutte le definizioni di commit avviate per un lavoro.
La seguente tabella mostra varie definizioni di commit e i loro nomi associati per uno specifico lavoro.
Gruppo di attivazione
Ambito di commit
Nome di definizione di commit
Qualsiasi
Lavoro
*JOB
Gruppo di attivazione predefinito
Gruppo di attivazione
*DFTACTGRP
Gruppo di attivazione denominato
dall'utente
Gruppo di attivazione
Nome del gruppo di attivazione (ad
esempio, PAYROLL)
Gruppo di attivazione denominato
dal sistema
Gruppo di attivazione
Numero del gruppo di attivazione
(ad esempio, 0000000145)
Nessuno
Denominato esplicitamente
QDIR001 (esempio di una definizione
di commit definita dal sistema per
uso esclusivo da parte del sistema). I
nomi di definizioni di commit
definite dal sistema iniziano con Q.
Nessuno
Transazione
*TNSOBJ
Solo i programmi compilati IBM ILE (Integrated Language Environment) possono avviare il controllo del
commit per i gruppi di attivazione diversi dal gruppo di attivazione predefinito. Pertanto, un lavoro può
utilizzare più definizioni di commit solo se sta eseguendo uno o più programmi compilati ILE.
I programmi OPM (Original Program Model) vengono eseguiti nel gruppo di attivazione predefinito e,
per impostazione predefinita, utilizzano la definizione di commit *DFTACTGRP. In un ambiente OPM e
ILE misto, i lavori devono utilizzare la definizione di commit a livello del lavoro se tutte le modifiche di
cui è possibile eseguire il commit apportate da tutti i programmi devono essere sottoposte a commit o a
rollback insieme.
Un file di database aperto incluso nell'ambito di un gruppo di attivazione può essere associato a una
definizione di commit a livello di gruppo di attivazione o a livello di lavoro. Un file di database aperto
incluso nell'ambito del lavoro può essere associato solo alla definizione di commit a livello di lavoro.
Pertanto, qualsiasi programma, OPM o ILE, che apre un file di database sotto il controllo del commit
incluso nell'ambito del lavoro deve utilizzare la definizione di commit a livello di lavoro.
I programmi applicativi non utilizzano il nome di definizione di commit per identificare una specifica
definizione di commit quando si esegue una richiesta di controllo del commit. I nomi di definizione di
commit sono principalmente utilizzati nei messaggi per identificare una specifica definizione di commit
per un lavoro.
Per le definizioni di commit a livello di gruppo di attivazione, il sistema determina quale definizione di
commit utilizzare, sulla base del gruppo di attivazione nel quale è in esecuzione il programma
richiedente. Questo è possibile perché i programmi eseguiti in un gruppo di attivazione in qualsiasi
momento non possono utilizzare che una singola definizione di commit.
Per le transazioni con dei blocchi nell'ambito della transazione, le API XA e gli attributi correlati alle
transazioni aggiunti alla CLI determinano quale definizione di commit è utilizzata dal sottoprocesso
richiamante.
Controllo del commit
9
Informazioni correlate
ILE concepts PDF
Esempio: lavori e definizioni di commit
Questa figura mostra un esempio di un lavoro che utilizza più definizioni di commit.
La figura indica quali aggiornamenti di file sono sottoposti a commit o a rollback a ogni livello di gruppo
di attivazione. L'esempio presume che tutti gli aggiornamenti apportati ai file di database da tutti i
programmi vengano eseguiti sotto il controllo del commit.
10
IBM i: Database Controllo del commit
Controllo del commit
11
La seguente tabella mostra in che modo viene eseguito il commit o il rollback dei file se lo scenario nella
figura precedente subisce delle modifiche.
Esempi aggiuntivi di più definizioni di commit in un lavoro
Modifica nello
scenario
Effetto sulle modifiche a questi file
F1 e F2
F3 e F4
F5 e F6
F7
PGMX esegue
un'operazione di
rollback invece di
un'operazione di
commit (3=
=COMMIT diventa
ROLLBACK).
In sospeso
Sottoposto a rollback
Già sottoposto a
commit
Sottoposto a rollback
PGMZ esegue
un'operazione di
commit prima della
restituzione a PGMX.
In sospeso
Sottoposto a commit
da PGMZ
Già sottoposto a
commit
Sottoposto a commit
In sospeso
Già sottoposto a
commit
In sospeso
Non sotto il controllo
del commit
Già sottoposto a
commit
Il file F7 non può
essere aperto perché
non esiste alcuna
definizione di commit
*JOB (PGMX non l'ha
creata).
In sospeso
PGMZ prova ad
avviare il controllo
del commit
specificando
CMTSCOPE(*ACTGRP)
dopo l'aggiornamento
del file F7. Il tentativo
ha esito negativo
perché le modifiche
sono in sospeso
utilizzando la
definizione di commit
a livello di lavoro.
PGMX non avvia il
controllo del commit
e non apre i file F3 e
F4 con
COMMIT(*YES).
PGMZ prova ad
aprire il file F7 con
COMMIT(*YES).
In sospeso
Modalità di funzionamento del controllo del commit con gli oggetti
Quando viene posto sotto il controllo del commit, un oggetto diventa una risorsa di cui è possibile
eseguire il commit. Viene registrato con la definizione di commit. Partecipa a ogni operazione di commit
e di rollback eseguita per la definizione di commit.
I
v
v
v
v
seguenti argomenti descrivono questi attributi di una risorsa di cui è possibile eseguire il commit:
Tipo di risorsa
Ubicazione
Protocollo di commit
Intento di accesso
Tipi di risorse di cui è possibile eseguire il commit
Questa tabella elenca i tipi differenti di risorse di cui è possibile eseguire il commit, inclusi FILE, DDL
(Data Definition Language), DDM (distributed data management), LU (logical unit) 6.2, DRDA
(Distributed Relational Database Architecture, API e TCP.
12
IBM i: Database Controllo del commit
La tabella visualizza i seguenti elementi:
v I tipi di risorse di cui è possibile eseguire il commit.
v Come vengono posti sotto il controllo del commit.
v Come vengono rimossi dal controllo del commit.
v Le limitazioni che si applicano al tipo di risorsa.
Tipo di risorsa
Come metterla sotto
il controllo del
commit
Quali tipi di
Come rimuoverla dal modifiche è possibile
controllo del commit sottoporre a commit Limitazioni
FILE- file di database
locali
Aprendola sotto il
controllo del commit1
Chiudendo il file, se
non c'è alcuna
modifica in sospeso.
Modifiche a livello di
record
Per una singola
transazione non
possono essere
bloccate più di 500
000 000 record2.
Modifiche a livello di
oggetto, come:
Solo delle modifiche a
livello di oggetto
eseguite utilizzando
SQL sono sotto il
controllo del commit.
Se delle modifiche
sono in sospeso
quando il file viene
chiuso, dopo
l'esecuzione della
successiva operazione
di commit o di
rollback.
DDL- modifiche a
livello di oggetto per
le raccolte SQL e le
tabelle SQL locali.
Eseguendo SQL sotto
il controllo del
commit
Eseguendo
un'operazione di
commit o di rollback
dopo la modifica a
livello di oggetto.
v Creazione di un
pacchetto SQL
v Creazione di una
tabella SQL
v Eliminazione di
una tabella SQL
DDM- file DDM
(distributed data
management) remoto
Aprendo sotto il
controllo del commit.
Il supporto del
controllo del commit
per DDM contiene
ulteriori informazioni
sul controllo del
commit e sulla
gestione dei dati
distribuiti.
Chiudendo il file, se
non c'è alcuna
modifica in sospeso.
Modifiche a livello di
record
Se delle modifiche
sono in sospeso
quando il file viene
chiuso, dopo
l'esecuzione della
successiva operazione
di commit o di
rollback.
LU 6.2- conversazione Avviando la
protetta
conversazione3
Terminando la
conversazione
DRDA- database
Utilizzando
relazionale distribuito l'istruzione SQL
CONNECT
Terminando la
connessione
Controllo del commit
13
Come metterla sotto
il controllo del
commit
Quali tipi di
Come rimuoverla dal modifiche è possibile
controllo del commit sottoporre a commit Limitazioni
API- risorsa di
commit API locale
API QTNADDCR
(Aggiunta di risorsa
di commit)
API QTNRMVCR
(Rimozione risorse di
commit)
Connessione
TCP-TCP/IP
Utilizzando
l'istruzione SQL
CONNECT a un RDB
definito per utilizzare
connessioni TCP/IP o
aprendo un file DDM
definito con
un'ubicazione TCP/IP
Terminando la
connessione SQL o
chiudendo il file
DDM se non ci sono
modifiche in sospeso.
Se il file DDM viene
chiuso con delle
modifiche in sospeso,
la connessione viene
chiusa dopo
l'esecuzione della
successiva operazione
di commit o di
rollback.
Tipo di risorsa
Questo viene
determinato dal
programma utente.
Le voci di giornale
possono essere scritte
dal programma
utente utilizzando
l'API QJOSJRNE
(Invio voce di
giornale) per un
ausilio nel tracciare
queste modifiche.
L'applicazione deve
fornire un
programma di uscita
da richiamare durante
le operazioni di
commit, rollback o
risincronizzazione.
Note:
1
Per informazioni dettagliate su come mettere un file di database sotto il controllo del commit, consultare il
manuale di riferimento al linguaggio appropriato. Le informazioni correlate per il controllo del commit collegano
ai manuali relativi al linguaggio che è possibile utilizzare.
2
È possibile utilizzare un file QAQQINI per ridurre il limite di 500 000 000. Consultare “Gestione della
dimensione della transazione” a pagina 75 per istruzioni.
3
Quando viene avviata una connessione DDM, il file DDM specifica PTCCNV(*YES) e il file DDM è definito con
un'ubicazione remota SNA; una risorsa LU 6.2 viene aggiunta con la risorsa DDM.
Quando viene avviata una connessione DRDA, una risorsa LU 6.2 viene aggiunta con la risorsa DRDA se ricorrono
entrambe le seguenti condizioni:
v Il programma sta utilizzando i protocolli di connessione di unità di lavoro distribuita.
v La connessione è a un RDB (rational database) definito con un'ubicazione remota SNA. Per ulteriori informazioni
sull'avvio di conversazioni protette, consultare il manuale APPC Programming
14
IBM i: Database Controllo del commit
.
Concetti correlati
Distributed database programming
“Aggiornamenti all'oggetto di notifica” a pagina 65
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di commit
eseguita correttamente per tale definizione di commit.
Riferimenti correlati
Add Commitment Resource (QTNADDCR) API
Remove Commitment Resource (QTNRMVCR) API
Send Journal Entry (QJOSJRNE) API
Risorse di cui è possibile eseguire il commit locali e remote
Una risorsa di cui è possibile eseguire il commit può essere una risorsa locale o una risorsa remota.
Risorsa locale di cui è possibile eseguire il commit
Una risorsa locale di cui è possibile eseguire il commit si trova sullo stesso sistema dell'applicazione.
Ciascun giornale associato alle risorse sotto il controllo del commit può essere considerato come
un'ubicazione locale. Tutte le risorse registrate senza un giornale (facoltativamente sia per le risorse DDL
sia per le risorse API) possono essere considerate come un'ubicazione locale separata.
Se una risorsa di cui è possibile eseguire il commit si trova in un lotto dischi indipendente e la
definizione di commit si trova in un lotto dischi differente, la risorsa non viene considerata locale.
Risorse remote di cui è possibile eseguire il commit
Una risorsa remota di cui è possibile eseguire il commit si trova su un sistema differente rispetto
all'applicazione. Esiste un'ubicazione remota per ciascuna conversazione univoca con un sistema remoto.
Una definizione di commit potrebbe avere una o più ubicazioni remote su uno o più sistemi remoti.
Quando si pone una risorsa locale sotto il controllo del commit per il lotto dischi di sistema, o qualsiasi
lotto dischi indipendente, è necessario utilizzare DRDA (Distributed Relational Database Architecture) per
accedere alle risorse sotto il controllo del commit in qualsiasi altro lotto dischi indipendente.
La seguente tabella mostra i tipi di risorse di cui è possibile eseguire il commit e le loro ubicazioni.
Tipo di risorsa
Ubicazione
API
Locale
DDL
Locale
DDM
Remota
DRDA
Locale o remota
FILE
Locale
LU62
Remota
TCP
Remota
Concetti correlati
“Controllo del commit e lotti dischi indipendenti” a pagina 22
I lotti dischi indipendenti e i gruppi di lotti dischi indipendenti possono ognuno avere un database i5/OS
separato. È possibile utilizzare il controllo del commit con questi database.
Intento di accesso di una risorsa di cui è possibile eseguire il commit
L'intento di accesso determina in che modo le risorse compartecipano a una transazione.
Controllo del commit
15
Quando una risorsa viene posta sotto il controllo del commit, il gestore risorsa indica come si accede alla
risorsa:
v Aggiorna
v Sola lettura
v Indeterminato
La seguente tabella mostra quali intenti di accesso sono possibili per uno specifico tipo di risorsa e in che
modo il sistema determina l'intento di accesso per una risorsa quando ne viene eseguita la registrazione.
Come viene determinato l'intento di
accesso
Tipo di risorsa
Possibili intenti di accesso
FILE
Aggiorna, sola lettura
In base al modo in cui è stato aperto
il file
DDL
Aggiorna
Aggiorna sempre
API
Aggiorna
Aggiorna sempre
DDM
Aggiorna, sola lettura
In base al modo in cui è stato aperto
il file
LU62
Indeterminato
Sempre indeterminato
DRDA
Aggiorna, sola lettura, indeterminato
Per DRDA Livello 1, l'intento di
accesso è aggiorna se non sono
registrate altre risorse remote.
Altrimenti l'intento di accesso è sola
lettura. Per DRDA Livello 2, l'intento
di accesso è sempre indeterminato.
TCP
Indeterminato
Sempre indeterminato
L'intento di accesso delle risorse che sono già registrate determina se è possibile registrare una nuova
risorsa. Si applicano le seguenti regole:
v Una risorsa in una fase il cui intento di accesso è aggiorna non può essere registrata quando ricorre
una qualsiasi delle seguenti condizioni:
– Le risorse il cui intento di accesso è aggiorna sono già registrate su altre ubicazioni.
– Le risorse il cui intento di accesso è indeterminato sono già registrate su altre ubicazioni.
– Le risorse il cui intento di accesso è indeterminato sono già registrate sulla stessa ubicazione e le
risorse sono state modificate durante la transazione corrente.
v Una risorsa in due fasi il cui intento di accesso è aggiorna non può essere registrata quando una risorsa
in una fase il cui intento di accesso è aggiorna è già registrata.
Protocollo di commit di una risorsa di cui è possibile eseguire il commit
Il protocollo di commit è la capacità che ha una risorsa di partecipare a un'elaborazione di commit in una
fase o in due fasi. Le risorse locali, fatta eccezione per le risorse di cui è possibile eseguire il commit API,
sono sempre delle risorse in due fasi.
Se una risorsa di cui è possibile eseguire il commit si trova in un lotto dischi indipendente e la
definizione di commit si trova in un lotto dischi differente, la risorsa non viene considerata come una
risorsa locale o una risorsa in due fasi.
Una risorsa in due fasi è detta anche risorsa protetta. Le risorse remote e le risorse di cui è possibile
eseguire il commit API devono essere registrate come risorse in una fase o come risorse in due fasi
quando vengono poste sotto il controllo del commit. La seguente tabella mostra quali tipi di risorse di cui
è possibile eseguire il commit possono coesistere in una definizione di commit con una risorsa in una
fase.
16
IBM i: Database Controllo del commit
Tipo di risorsa
Può coesistere con
Risorsa API in una fase
Altre risorse locali. Nessuna risorsa remota.
Risorsa remota in una fase
Altre risorse in una fase nella stessa ubicazione. Nessuna
risorsa locale.
Concetti correlati
“Controllo del commit e lotti dischi indipendenti” a pagina 22
I lotti dischi indipendenti e i gruppi di lotti dischi indipendenti possono ognuno avere un database i5/OS
separato. È possibile utilizzare il controllo del commit con questi database.
File registrati su giornale e controllo del commit
È necessario registrare su giornale (registrazione) un file di database (tipo di risorsa FILE o DDM) prima
che possa essere aperto per l'emissione sotto il controllo del commit o prima che un'applicazione SQL,
che utilizza un livello di isolamento diverso da *NONE (nessun commit), possa fare riferimento a essa.
Un file non deve necessariamente essere registrato su giornale per aprirlo per operazioni limitate
all'immissione sotto il controllo del commit.
Viene notificato un errore se si verifica una delle seguenti condizioni:
v È stato effettuato un tentativo di aprire un file di database per l'emissione sotto il controllo del commit
ma il file non è attualmente registrato su giornale.
v Non è avviata alcuna definizione di commit che può essere utilizzata dal file aperto sotto il controllo
del commit.
Se si stanno registrando su giornale solo le immagini-successive per un file di database aperto sotto il
controllo del commit, il sistema avvia automaticamente la registrazione su giornale sia per le
immagini-precedenti sia per le immagini-successive. Le immagini-precedenti vengono scritte solo per le
modifiche al file che si verificano sotto il controllo del commit. Se contemporaneamente vengono
apportate al file delle altre modifiche che non sono sotto il controllo del commit, per esse vengono scritte
solo le immagini-successive.
Il sistema scrive automaticamente le modifiche di cui è possibile eseguire il commit a livello di record e le
modifiche di cui è possibile eseguire il commit a livello di oggetto in un giornale. Per le modifiche a
livello di record, il sistema utilizza quindi le voci di giornale, se necessario, per scopi di ripristino; il
sistema non utilizza le voci per le modifiche di cui è possibile eseguire il commit a livello di oggetto per
scopi di ripristino. Inoltre, il sistema non scrive automaticamente le voci di giornale per le risorse di
commit API. Tuttavia, il programma di uscita per la risorsa API può utilizzare l'API QJOSJRNE (Invio
voce di giornale) per scrivere le voci di giornale per fornire una traccia di controllo o per essere di ausilio
nel ripristino. Il contenuto di queste voci è controllato dal programma di uscita utente.
Per eseguire il ripristino per le risorse di commit a livello di oggetto, il sistema utilizza un'altra tecnica,
non il giornale. Il ripristino per le risorse di commit API viene eseguito richiamando il programma di
uscita di commit e rollback associato a ogni specifica risorsa di commit API. È responsabilità del
programma di uscita eseguire l'effettivo ripristino necessario per la situazione.
Concetti correlati
Journal management
Sequenza di voci di giornale sotto il controllo del commit
Questa tabella mostra la sequenza di voci di norma scritte mentre è attiva una definizione di commit. È
possibile utilizzare il programma di ricerca delle informazioni sulle voci del giornale per ottenere ulteriori
informazioni sul contenuto delle voci di giornale.
Le voci di controllo del commit vengono scritte in un giornale locale se ricorre almeno una delle seguenti
condizioni:
v Il giornale è specificato come giornale predefinito nel comando STRCMTCTL (Avvio controllo commit).
Controllo del commit
17
v Almeno un file registrato su giornale è aperto sotto il controllo del commit.
v Almeno una risorsa di commit API associata al giornale è registrata sotto il controllo del commit.
Tipo di voce
Descrizione
Dove è scritta
Quando è scritta
C BC
Avvio del controllo del
commit
Nel giornale predefinito, se
ne è specificata una nel
comando STRCMTCTL.
Quando viene utilizzato il
comando STRCMTCTL.
Nel giornale.
Quando il primo file
registrato su un giornale
viene aperto o quando una
risorsa API viene registrata
per un giornale.
Nel giornale.
Quando si verifica la prima
modifica di record per la
transazione per un file
registrato su questo
giornale1.
Nel giornale per una
risorsa API.
Quando l'API QJOSJRNE
viene utilizzata per la
prima volta con la chiave di
inclusione dell'identificativo di
ciclo di commit.
C SC
Avvio del ciclo di commit
Codici giornale D ed F
Voci a livello di oggetto
DDL
Quando si verificano degli
Nel giornale associato
aggiornamenti.
all'oggetto di cui si sta
eseguendo l'aggiornamento.
Solo le voci di giornale che
contengono un
identificativo di ciclo di
commit rappresentano una
modifica a livello di
oggetto DDL che fa parte
della transazione.
Codice giornale R
Voci a livello di record
Nel giornale associato al
file di cui si sta eseguendo
l'aggiornamento.
Quando si verificano gli
aggiornamenti.
Codice giornale U
Voci create dall'utente
Nel giornale associato a
una risorsa API.
Quando l'API QJOSJRNE
viene utilizzata per la
prima volta con la chiave di
inclusione dell'identificativo di
ciclo di commit.
C CM
Commit
Nel giornale.
Dopo che il commit è stato
completato correttamente.
Nel giornale predefinito.
Se delle risorse di cui è
possibile eseguire il commit
sono associate al giornale.
Nel giornale.
Dopo che l'operazione di
rollback è stata completata.
Nel giornale predefinito.
Se delle risorse di cui è
possibile eseguire il commit
sono associate al giornale.
C RB
18
Rollback
IBM i: Database Controllo del commit
Tipo di voce
Descrizione
Dove è scritta
Quando è scritta
C LW
Termine della transazione
Nel giornale predefinito, se Dopo che l'operazione di
commit o di rollback è stata
ne è specificata una nel
completata.
comando STRCMTCTL. Il
sistema scrive un record di
intestazione LW e uno o
più record di dettaglio.
Queste voci vengono scritte
solo se OMTJRNE(*NONE)
viene specificato nel
comando STRCMTCTL o se
si verifica un errore di
sistema.
C EC
Termine del controllo del
commit
Nel giornale.
Dopo che il comando
ENDCMTCTL (Fine
controllo commit) è stato
completato.
In un giornale locale che
non è il giornale
predefinito.
Quando viene stabilito un
limite di commit, dopo il
punto in cui tutte le risorse
di cui è possibile eseguire il
commit associate a tale
giornale sono state rimosse
dal controllo del commit.
C SB
Avvio di punto di
salvataggio o ciclo di
commit nidificato.
Nel giornale.
Quando l'applicazione crea
un SQL SAVEPOINT o
quando il sistema crea un
ciclo di commit nidificato
interno per gestire una serie
di funzioni database come
una singola operazione2.
C SQ
Rilascio del punto di
salvataggio o esecuzione
del commit del ciclo di
commit nidificato.
Nel giornale.
Quando l'applicazione
rilascia un SQL
SAVEPOINT o quando il
sistema esegue il commit di
un ciclo di commit
nidificato internamente2.
C SU
Rollback del punto di
salvataggio o del ciclo di
commit nidificato.
Nel giornale.
Quando l'applicazione
esegue il rollback di un
SQL SAVEPOINT o quando
il sistema esegue il rollback
di un ciclo di commit
nidificato internamente2.
Controllo del commit
19
Tipo di voce
Descrizione
Dove è scritta
Quando è scritta
Note:
1
È possibile specificare che la parte a lunghezza fissa della voce di giornale includa le informazioni sulla
transazione specificando il valore *LUW (relativo all'unità di lavoro logica) per il parametro FIXLENDTA (relativo ai
dati a lunghezza fissa) del comando CRTJRN (Creazione giornale) o CHGJRN (Modifica giornale). Specificando il
parametro FIXLENDTA (*LUW), la parte a lunghezza fissa di ciascuna voce di giornale C SC conterrà il LUWID
(Logical Unit of Work ID, ossia l'ID unità di lavoro logica) della transazione corrente. Allo stesso modo, per le
transazioni XA, se si specifica il parametro FIXLENDTA (*XID), la parte a lunghezza fissa di ciascuna voce di
giornale C SC conterrà l'XID della transazione corrente. Il LUWID o l'XID possono essere di ausilio nel trovare tutti
i cicli di commit per una specifica transazione se la transazione coinvolge più giornali o sistemi.
2
Queste voci vengono inviate solo se si imposta la variabile di ambiente QTN_JRNSAVPT_MYLIB_MYJRN su *YES,
dove MYJRN è il giornale che si sta utilizzando e MYLIB è la libreria in cui è memorizzato il giornale. Il valore
speciale *ALL è supportato per i valori MYLIB e MYJRN. È possibile impostare queste variabili a livello dell'intero
sistema oppure per uno specifico lavoro. Per fare in modo che le voci vengano inviate per il giornale
MYLIB/MYJRN per un solo lavoro, utilizzare questo comando in tale lavoro:
v ADDENVVAR ENVVAR(QTN_JRNSAVPT_MYLIB_MYJRN) VALUE(*YES)
Per fare in modo che le voci vengano inviate per tutti i giornali per tutti i lavori, utilizzare questo comando:
v ADDENVVAR ENVVAR('QTN_JRNSAVPT_*ALL_*ALL') VALUE(*YES) LEVEL(*SYS)
|
|
|
|
|
Il valore di questa variabile di ambiente viene memorizzato in cache internamente per ogni definizione di commit la
prima volta che una risorsa correlata a uno specifico giornale viene posta sotto il controllo del commit. Se la
variabile di ambiente viene modificata dopo tale punto, il valore memorizzato nella cache deve essere aggiornato
perché diventi effettivo per tale giornale. Qualsiasi chiamata dell'API di richiamo di informazioni di commit
QTNRCMTI aggiorna il valore memorizzato nella cache nel lavoro chiamante.
Concetti correlati
“Operazione di commit” a pagina 3
Un'operazione di commit rende permanenti tutte le modifiche eseguite sotto il controllo del commit dopo
la precedente operazione di commit o rollback. Il sistema rilascia anche tutti i blocchi correlati alla
transazione.
Journal entry information finder
Riferimenti correlati
End Commitment Control (ENDCMTCTL) command
Identificativo di ciclo di commit
Un ciclo di commit è il tempo che intercorre tra un limite di commit e il successivo. Il sistema assegna un
identificativo di ciclo di commit per associare tra di loro tutte le voci di giornale per uno specifico ciclo di
commit. Ciascun giornale che partecipa a una transazione ha un proprio ciclo di commit e un proprio
identificativo di ciclo di commit.
L'identificativo di ciclo di commit è il numero di sequenza del giornale della voce di giornale C SC scritta
per il ciclo di commit. L'identificativo di ciclo di commit viene inserito in ciascuna voce di giornale scritta
durante il ciclo di commit. Se viene utilizzato più di un giornale durante il ciclo di commit,
l'identificativo di ciclo di commit per ciascun giornale è differente.
È possibile specificare che la parte a lunghezza fissa della voce di giornale includa le informazioni sulla
transazione specificando il valore *LUW (relativo all'unità di lavoro logica) per il parametro FIXLENDTA
(relativo ai dati a lunghezza fissa) del comando CRTJRN (Creazione giornale) o CHGJRN (Modifica
giornale). Specificando il parametro FIXLENDTA (*LUW), la parte a lunghezza fissa di ciascuna voce di
giornale C SC conterrà il LUWID (Logical Unit of Work ID, ossia l'ID unità di lavoro logica) della
transazione corrente. Allo stesso modo, per le transazioni XA, se si specifica il parametro FIXLENDTA
(*XID), la parte a lunghezza fissa di ciascuna voce di giornale C SC conterrà l'XID della transazione
20
IBM i: Database Controllo del commit
corrente. Il LUWID o l'XID possono essere di ausilio nel trovare tutti i cicli di commit per una specifica
transazione se la transazione coinvolge più giornali o sistemi.
È possibile utilizzare l'API QJOSJRNE (Invio voce di giornale) per scrivere le voci di giornale per le
risorse API. Si dispone dell'opzione di includere l'identificativo di ciclo di commit in queste voci di
giornale.
È possibile utilizzare l'identificativo di ciclo di commit per applicare/eliminare modifiche registrate su
giornale a/da un limite di commit utilizzando il comando APYJRNCHG (Applicazione modifiche
giornale) oppure il comando RMVJRNCHG (Eliminazione modifiche giornale). Si applicano le seguenti
limitazioni:
v La maggior parte delle modifiche a livello di oggetto eseguite sotto il controllo del commit sono scritte
nel giornale ma non sono applicate o eliminate utilizzando i comandi APYJRNCHG e RMVJRNCHG.
v L'API QJOSJRNE scrive le voci di giornale create dall'utente con un codice giornale di U. Queste voci
non possono essere applicate o eliminate utilizzando i comandi APYJRNCHG e RMVJRNCHG. Devono
essere applicate o eliminate con un programma scritto dall'utente.
Blocco di record
Quando un lavoro detiene un blocco del record e un altro lavoro prova a richiamare tale record per
l'aggiornamento, il lavoro richiedente attende e viene rimosso dall'elaborazione attiva.
Il lavoro richiedente sarà inattivo finché non si verifica uno dei seguenti eventi:
v Il blocco del record viene rilasciato.
v Il tempo di attesa specificato termina.
Più di un lavoro può richiedere un record bloccato da un altro lavoro. Quando il blocco del record viene
rilasciato, il record viene ricevuto dal primo lavoro che lo richiede. Quando si attende un record bloccato,
specificare il tempo di attesa nel parametro WAITRCD nei seguenti comandi di creazione, modifica o
sostituzione:
v CRTPF (Creazione file fisico)
v CRTLF (Creazione file logico)
v CRTSRCPF (Creazione file fisico origine)
v CHGPF (Modifica file fisico)
v CHGLF (Modifica file logico)
v CHGSRCPF (Modifica file fisico origine)
v OVRDBF (Sostituzione file di database)
Quando si specifica il tempo di attesa, considerare le seguenti informazioni:
v Se non si specifica un valore, il programma attende per il tempo di attesa predefinito per il processo.
v Per le definizioni di commit che hanno solo blocchi nell'ambito della transazione, il tempo di attesa
predefinito del lavoro può essere sovrascritto da un tempo di attesa di blocco della transazione che può
essere specificato:
– Nell'API xa_open.
– In un'interfaccia JDBC o JTA. Le transazioni distribuite elencano queste API.
v Se il record non può essere assegnato entro il tempo specificato, viene inviato un messaggio di notifica
al programma HLL (high-level language).
v Se il tempo di attesa per un record viene superato, il messaggio inviato alla registrazione lavoro
fornisce il nome del lavoro che detiene il record bloccato che ha causato l'attesa per il lavoro
richiedente. Se si verificano delle eccezioni di blocco del record, è possibile utilizzare la registrazione
lavoro come ausilio nel determinare quali programmi modificare in modo che non detengano dei
blocchi per lunghi periodi.
Controllo del commit
21
I programmi detengono dei blocchi di record per lunghi periodi per uno dei seguenti motivi:
v Il record rimane bloccato mentre l'utente della stazione di lavoro sta considerando una modifica.
v Il blocco del record fa parte di una lunga transazione di commit. Considerare l'esecuzione di
transazioni più piccole per consentire un'esecuzione più frequente di un'operazione di commit.
v Si è verificato un blocco indesiderato. Si presuma, ad esempio, che un file è definito come un file di
aggiornamento con delle chiavi univoche e che il programma aggiorni e aggiunga ulteriori record al
file. Se l'utente della stazione di lavoro desidera aggiungere un record al file, il programma potrebbe
provare ad accedere al record per determinare se la chiave esiste già. In questo caso, il programma
informa l'utente della stazione di lavoro che la richiesta eseguita non è valida. Quando il record viene
richiamato dal file, esso viene bloccato finché non viene rilasciato in modo implicito da un'altra
operazione di lettura sullo stesso file o finché non viene rilasciato esplicitamente.
Nota: per ulteriori informazioni su come utilizzare l'interfaccia HLL (high-level language) per rilasciare
i blocchi del record, consultare l'appropriato manuale di riferimento HLL (high-level language).
Le informazioni correlate per il controllo del commit hanno dei collegamenti ai manuali HLL
(high-level language) che è possibile utilizzare con il controllo del commit.
La durata del blocco è molto più lunga se viene specificato LCKLVL(*ALL) perché il record che era
stato richiamato dal file viene bloccato finché non si verifica la successiva operazione di commit o di
rollback. Non viene rilasciato in modo implicito da un'altra operazione di lettura e non può essere
rilasciato in modo esplicito.
Un'altra funzione che può mettere un blocco su un file è la funzione di salvataggio durante l'utilizzo.
Concetti correlati
Transazioni distribuite JDBC
Funzione salva-mentre-attivo
Riferimenti correlati
“Informazioni correlate per il controllo del commit” a pagina 120
I manuali dei prodotti, le pubblicazioni IBM Redbooks, i siti Web e altre raccolte di argomenti
dell'information center contengono informazioni correlate alla raccolta di argomenti Controllo del commit.
È possibile visualizzare o stampare qualsiasi file PDF.
Controllo del commit e lotti dischi indipendenti
I lotti dischi indipendenti e i gruppi di lotti dischi indipendenti possono ognuno avere un database i5/OS
separato. È possibile utilizzare il controllo del commit con questi database.
Tuttavia, poiché ogni lotto dischi indipendente o gruppo di lotti dischi indipendente ha un database SQL
separato, occorre tener presente alcune considerazioni.
Concetti correlati
“Definizione di commit” a pagina 5
La definizione di commit contiene informazioni pertinenti alle risorse di cui è in corso la modifica sotto il
controllo del commit durante una transazione.
“Risorse di cui è possibile eseguire il commit locali e remote” a pagina 15
Una risorsa di cui è possibile eseguire il commit può essere una risorsa locale o una risorsa remota.
“Protocollo di commit di una risorsa di cui è possibile eseguire il commit” a pagina 16
Il protocollo di commit è la capacità che ha una risorsa di partecipare a un'elaborazione di commit in una
fase o in due fasi. Le risorse locali, fatta eccezione per le risorse di cui è possibile eseguire il commit API,
sono sempre delle risorse in due fasi.
Considerazioni sui lotti dischi indipendenti per le definizioni di commit
Quando si utilizzano i lotti dischi indipendenti, è necessario tenere presenti le seguenti considerazioni per
le definizioni di commit.
22
IBM i: Database Controllo del commit
Considerazioni sulla libreria QRECOVERY
Quando si avvia il controllo del commit, la definizione di commit viene creata nella libreria
QRECOVERY. Ogni lotto dischi indipendente o gruppo di lotti dischi indipendenti ha la propria versione
di una libreria QRECOVERY. Su un lotto dischi indipendente, il nome della libreria QRECOVERY è
QRCYxxxxx, dove xxxxx è il numero del lotto dischi indipendente. Ad esempio, il nome della libreria
QRECOVERY per il lotto dischi indipendente 39 è QRCY00039. Inoltre, se il lotto dischi indipendente fa
parte di un gruppo di lotti dischi, solo il lotto dischi primario ha una libreria QRCYxxxxx.
Quando si avvia il controllo del commit, la definizione di commit viene creata nella libreria QRECOVERY
del lotto dischi indipendente associato a tale lavoro, rendendo il controllo del commit attivo sul lotto
dischi indipendente.
Considerazioni su Impostazione gruppo ASP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Utilizzare il comando SETASPGRP (Impostazione gruppo ASP) mentre il controllo del commit è attivo su
un lotto dischi indipendente ha i seguenti effetti:
v Se si passa da un lotto dischi indipendente a un altro e le risorse sono registrate con il controllo del
commit sul lotto dischi, il comando SETASPGRP ha esito negativo con il messaggio CPDB8EC, codice
errore 2, Nel sottoprocesso è presente una transazione non sottoposta a commit. Questo
messaggio è seguito dal messaggio CPFB8E9.
v Se si passa da un lotto dischi indipendente a un altro e nessuna risorsa è registrata con il controllo del
commit, le definizioni di commit vengono spostate al lotto dischi indipendente cui si sta passando.
v Se si passa dal lotto dischi di sistema (gruppo ASP *NONE) a un altro, il controllo del commit rimane
invariato. Le definizioni di commit restano sul lotto dischi di sistema. Se, successivamente, si
posizionano le risorse del lotto dischi indipendente sotto il controllo del commit prima delle risorse del
lotto dischi di sistema, la definizione di commit viene spostata al lotto dischi indipendente.
v Se si utilizza un oggetto di notifica, l'oggetto di notifica deve trovarsi sullo stesso lotto dischi
indipendente o gruppo di lotti dischi indipendenti della definizione di commit.
v Se si sposta la definizione di commit in un altro lotto dischi indipendente o gruppo di lotti dischi
indipendenti, anche l'oggetto di notifica deve trovarsi sull'altro lotto dischi indipendente o gruppo di
lotti dischi indipendenti. L'oggetto di notifica sull'altro lotto dischi indipendente o gruppo di lotti
dischi indipendenti viene aggiornato se si verifica una fine anomala della definizione di commit. Se
l'oggetto di notifica non viene trovato sull'altro lotto dischi indipendente o gruppo di lotti dischi
indipendenti, l'aggiornamento ha esito negativo con il messaggio CPF8358.
Lo spazio nome corrente del lavoro determina qual è l'IASP (Independent ASP) in cui viene creata la
definizione di commit. Se il lavoro non è associato a un IASP (Independent ASP), la definizione di
commit viene creata in *SYSBAS, altrimenti viene creata nell'IASP (Independent ASP). Se il lavoro è
associato a un IASP (Independent ASP), è possibile aprire i file sotto il controllo del commit che si
trovano nello spazio nome libreria corrente; possono trovarsi, ad esempio, nell'IASP (Independent ASP) o
in *SYSBAS. Se la prima risorsa posta sotto il controllo del commit non si trova nello stesso ASP della
definizione di commit, la definizione di commit viene spostata all'ASP della risorsa. Se sia la risorsa
*SYSBAS sia la risorsa IASP (Independent ASP) sono registrate nella stessa definizione di commit, il
sistema utilizza implicitamente un protocollo di commit in due fasi per assicurare che le risorse vengano
sottoposte a commit in modo atomico (indivisibile) se si verifica un malfunzionamento del sistema.
Pertanto, le transazioni che comportano dei dati sia in *SYSBAS sia in un IASP (Independent ASP)
avranno prestazioni inferiori alle transazioni isolate a un singolo gruppo ASP.
Considerazioni sul giornale predefinito
Sono da notare le seguenti considerazioni sul giornale predefinito:
v Se si utilizza il giornale predefinito, il giornale deve trovarsi sullo stesso lotto dischi indipendente o
gruppo di lotti dischi indipendenti della definizione di commit.
Controllo del commit
23
v Se il giornale predefinito non viene trovato sull'altro lotto dischi indipendente o gruppo di lotti dischi
indipendenti quando viene avviato il controllo del commit, l'avvio del controllo del commit ha esito
negativo con il messaggio CPF9873.
v Se si sposta la definizione di commit in un altro lotto dischi indipendente o gruppo di lotti dischi
indipendenti, anche il giornale predefinito deve trovarsi sull'altro lotto dischi indipendente o gruppo di
lotti dischi indipendenti. Se il giornale non viene trovato sull'altro lotto dischi indipendente o gruppo
di lotti dischi indipendenti, la definizione di commit viene spostata ma, da questo punto in poi, non
viene utilizzato alcun giornale predefinito.
Considerazioni su IPL (initial program load) e disattivazione
|
|
|
|
|
|
Sono da notare le seguenti considerazioni su IPL e disattivazione:
v Il ripristino di definizioni di commit che si trovano su un lotto dischi indipendente viene eseguito
durante l'elaborazione di attivazione del lotto dischi indipendente ed è simile al ripristino IPL.
v Le definizioni di commit in un lotto dischi indipendente non vengono ripristinate durante l'IPL di
sistema.
v Quando è richiesto il ripristino per una definizione di commit che contiene risorse che si trovano sia in
*SYSBAS sia in un IASP (Independent ASP), la definizione di commit verrà divisa in due definizioni di
commit durante il ripristino, una in *SYSBAS e una nell'IASP (Independent ASP), come se esistesse una
connessione a un database remoto tra i due gruppi ASP. La risincronizzazione può essere iniziata dal
sistema durante il ripristino per assicurare che i dati in entrambi i gruppi ASP siano sottoposti a
commit o a rollback in modo atomico (indivisibile).
v La disattivazione di un lotto dischi indipendente ha i seguenti effetti sulle definizioni di commit:
– I lavori associati al lotto dischi indipendente terminano.
– Non è consentita la creazione di alcuna nuova definizione di commit sul lotto dischi indipendente.
– Le definizioni di commit che si trovano sul lotto dischi indipendente diventano inutilizzabili.
– Le definizioni che si trovano sul lotto dischi indipendente, ma non collegate a un lavoro, rilasciano i
blocchi nell'ambito della transazione.
Considerazioni sui database remoti
Sono da notare le seguenti considerazioni sui database remoti:
v Non è possibile utilizzare una connessione SNA LU 6.2 (conversazioni protette o DUW (Distributed
Unit of Work - unità di lavoro distribuita) per stabilire una connessione a un database remoto da un
database di lotto dischi indipendente. È possibile utilizzare le conversazioni SNA non protette per
stabilire una connessione da un database di lotto dischi indipendente a un database remoto.
v Quando il controllo del commit è attivo per un lavoro o un sottoprocesso, l'accesso ai dati
esternamente al lotto dischi indipendente o al gruppo di lotti dischi cui appartiene la definizione di
commit è possibile solo in remoto, come se fossero dati che si trovano su un altro sistema. Quando si
emette un'istruzione SQL CONNECT per stabilire una connessione al database relazionale (RDB) sul
lotto dischi indipendente, il sistema rende remota la connessione.
v Il lotto dischi di sistema e i lotti dischi di base non richiedono una connessione remota per l'accesso in
sola lettura ai dati che si trovano su un lotto dischi indipendente. In modo analogo, un lotto dischi
indipendente non richiede una connessione remota per l'accesso in sola lettura ai dati che si trovano
sul lotto dischi di sistema o su un lotto dischi di base.
24
IBM i: Database Controllo del commit
Concetti correlati
“Definizione di commit” a pagina 5
La definizione di commit contiene informazioni pertinenti alle risorse di cui è in corso la modifica sotto il
controllo del commit durante una transazione.
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
“Ripristino del controllo del commit durante l'IPL (initial program load) dopo la fine anomala” a pagina
67
Quando si esegue un IPL (initial program load) dopo la fine anomala del sistema, il sistema prova a
ripristinare tutte le definizioni di commit che erano attive quando il sistema è stato terminato.
Considerazioni per le transazioni XA
Nell'ambiente XA, ciascun database viene considerato un gestore risorsa separato. Quando un gestore
transazioni desidera accedere a due database sotto la stessa transazione, deve utilizzare i protocolli XA
per eseguire un commit in due fasi con i due gestori risorse.
Poiché ciascun lotto dischi indipendente è un database SQL separato, nell'ambiente XA ciascun lotto
dischi indipendente viene considerato anche un gestore risorsa separato. Per consentire al server delle
applicazioni di eseguire una transazione destinata a due lotti dischi indipendenti differenti, il gestore
transazioni deve utilizzare anche un protocollo di commit in due fasi.
Concetti correlati
“Supporto delle transazioni XA per il controllo del commit” a pagina 46
DB2 for i può partecipare nelle transazioni globali X/Open.
Independent disk pool examples
Considerazioni e limitazioni per il controllo del commit
È necessario tenere presente le seguenti considerazioni e limitazioni per il controllo del commit.
Considerazioni sul file di database
v Se si specifica che un file condiviso venga aperto sotto il controllo del commit, tutti i successivi utilizzi
di tale file devono essere aperti sotto il controllo del commit.
v Se SEQONLY(*YES) viene specificato per il file aperto per la sola lettura con LCKLVL(*ALL)
(implicitamente o tramite un programma HLL (high-level language) oppure esplicitamente tramite il
comando OVRDBF (Sostituzione con file database)), SEQONLY(*YES) viene ignorato e viene utilizzato
SEQONLY(*NO).
v Le modifiche a livello di record apportate sotto il controllo del commit vengono registrate in un
giornale. Queste modifiche possono essere applicate al, o eliminate dal, database con il comando
APYJRNCHG (Applicazione modifiche giornale) oppure il comando RMVJRNCHG (Eliminazione
modifiche giornale).
v Sia le immagini-precedenti sia le immagini-successive dei file vengono registrate sul giornale sotto il
controllo del commit. Se si specifica di registrare sul giornale solo le immagini-successive dei file, il
sistema registra sul giornale automaticamente anche l'immagine-precedente delle modifiche al file che
si sono verificate sotto il controllo del commit. Tuttavia, poiché le immagini-precedenti non vengono
catturate per tutte le modifiche apportate ai file, non è possibile utilizzare il comando RMVJRNCHG
per questi file.
Considerazioni per le modifiche a livello di oggetto e a livello di record
v Le modifiche a livello di oggetto e a livello di record eseguite sotto il controllo del commit utilizzando
SQL utilizzano la definizione di commit attualmente attiva per il gruppo di attivazione in cui è in
Controllo del commit
25
esecuzione il programma richiedente. Se non è attiva né la definizione di commit a livello di lavoro né
quella a livello di gruppo di attivazione, SQL avvierà una definizione di commit a livello di gruppo di
attivazione.
Considerazioni sul commit in una fase e in due fasi
v Mentre è stabilita una connessione o una conversazione remota in una fase, le connessioni o le
conversazioni remote ad altre ubicazioni non sono consentite. Se è stabilito un limite di commit e
vengono eliminate tutte le risorse, l'ubicazione può essere modificata.
v Se si sta utilizzando il commit in due fasi, non è necessario utilizzare il comando SBMRMTCMD
(Immissione comando remoto) per avviare il controllo del commit o eseguire eventuali altre operazioni
di controllo del commit sulle ubicazioni remote. Il sistema esegue queste funzioni per conto dell'utente.
v Per un'ubicazione remota in una fase, i comandi CL COMMIT e ROLLBACK avranno esito negativo se
SQL si trova nello stack di chiamata e il database relazionale remoto non si trova su un sistema. Se
SQL non si trova nello stack di chiamata, i comandi COMMIT e ROLLBACK non avranno esito
negativo.
v Per un'ubicazione remota in una fase, il controllo del commit deve essere avviato sul sistema di origine
prima di apportare delle modifiche di cui è possibile eseguire il commit alle risorse remote. Il sistema
avvia automaticamente il controllo del commit per l'SQL di database distribuito sul sistema di origine
in fase di connessione se il programma SQL è in esecuzione con l'opzione di controllo del commit
impostata su un valore diverso da *NONE. Quando la prima risorsa remota viene posta sotto il
controllo del commit, il sistema avvia il controllo del commit sul sistema di destinazione.
Considerazione sul salvataggio
Un'operazione di salvataggio non è consentita se il lavoro che esegue il salvataggio ha una o più
definizioni di commit attive con uno qualsiasi dei seguenti tipi di modifiche di cui è possibile eseguire il
commit:
v Una modifica di record a un file che si trova nella libreria di cui si sta eseguendo il salvataggio. Per i
file logici, vengono controllati tutti i file fisici correlati.
v Qualsiasi modifica a livello di oggetto in una libreria di cui si sta eseguendo il salvataggio.
v Qualsiasi risorsa API che è stata aggiunta utilizzando l'API QTNADDCR (Aggiunta risorsa di commit)
e con il campo che indica che è consentita la normale elaborazione di salvataggio impostato sul valore
predefinito di N.
Questo impedisce alle operazioni di salvataggio di salvare sul supporto di salvataggio le modifiche
dovute a una transazione parziale.
Nota: se si utilizza il nuovo salvataggio con la funzione di transazioni parziali, l'oggetto può essere
salvato senza terminare una definizione di commit.
I blocchi di oggetti e i blocchi di record impediscono il salvataggio sul supporto di salvataggio
delle modifiche in sospeso dalle definizioni di commit in altri lavori. Questo è vero solo per le
risorse di commit API se i blocchi vengono acquisiti quando vengono apportate delle modifiche
all'oggetto o agli oggetti associati alla risorsa di commit API.
Considerazioni e limitazioni varie
v Prima di aggiornare il sistema a una nuova release, tutte le risincronizzazioni in sospeso devono essere
completate o annullate.
v I valori COMMIT e ROLLBACK vengono visualizzati nel campo relativo alla funzione di WRKACTJOB
durante un commit o un rollback. Se tale funzione rimane COMMIT o ROLLBACK per molto tempo, è
possibile che si sia verificato uno dei seguenti eventi:
– Un errore di risorsa durante il commit o il rollback richiede la risincronizzazione. Il controllo non
ritornerà all'applicazione finché la risincronizzazione non sarà stata completata o annullata.
26
IBM i: Database Controllo del commit
– Questo sistema ha indicato la decisione VRO (vote read-only) durante il commit. Il controllo non
ritornerà all'applicazione finché il sistema che ha iniziato il commit non avrà inviato i dati a questo
sistema.
– Questo sistema ha indicato che era OK tralasciare durante il commit. Il controllo non ritornerà
all'applicazione finché il sistema che ha iniziato il commit non invierà i dati a questo sistema.
Concetti correlati
Assicurazione dell'integrità del commit in due fasi
“Livello di blocco del commit” a pagina 55
Il valore specificato per il parametro LCKLVL nel comando STRCMTCTL (Avvio controllo commit)
diventa il livello predefinito di blocco di record per i file di database aperti e posti sotto il controllo del
commit per la definizione di commit.
Riferimenti correlati
Override with Database File (OVRDBF) command
Apply Journaled Changes (APYJRNCHG) command
Remove Journaled Changes (RMVJRNCHG) command
SQL programming
Submit Remote Command (SBMRMTCMD) command
Commit (COMMIT) command
Rollback (ROLLBACK) command
Add Commitment Resource (QTNADDCR) API
Controllo del commit per le applicazioni batch
Le applicazioni batch possono richiedere o meno il controllo del commit. In alcuni casi, un'applicazione
batch può eseguire una singola funzione di lettura di un file di immissione e di aggiornamento di un file
master. Tuttavia, è possibile utilizzare il controllo del commit per questo tipo di applicazione se è
importante avviarla nuovamente dopo una fine anomala.
Il file di immissione è un file di aggiornamento con un codice nei record per indicare che è stato
elaborato un record. Questo file e gli eventuali file aggiornati vengono posti sotto il controllo del commit.
Quando è presente nel file di immissione, il codice rappresenta una transazione completata. Il programma
legge il file di immissione e tralascia i record con un codice di completato. Questo consente l'utilizzo della
stessa logica di programma per le condizioni normali e di riavvio.
Se l'applicazione batch contiene dei record di immissione interdipendenti e contiene commutazioni o
totali, è possibile utilizzare un oggetto di notifica per fornire informazioni sul riavvio. I valori conservati
nell'oggetto di notifica vengono utilizzati per riavviare l'elaborazione dall'ultima transazione di cui è stato
eseguito il commit nel file di immissione.
|
|
|
|
|
|
|
|
|
|
|
|
Se i record di immissione sono interdipendenti, possono essere elaborati come una transazione. Un lavoro
batch può bloccare un massimo di 500 000 000 record. È possibile ridurre questo limite utilizzando un file
delle opzioni query (QAQQINI). Utilizzare il parametro QRYOPTLIB del comando CHGQRYA (Modifica
attributi query) per specificare un file delle opzioni query che può essere utilizzato da un lavoro.
Utilizzare il valore COMMITMENT_CONTROL_LOCK_LEVEL nel file delle opzioni query come limite di
blocco per il lavoro. Il valore del limite di blocco viene memorizzato internamente nella cache per
ciascuna definizione di commit la prima volta che una risorsa registrata su giornale viene posta sotto il
controllo del commit. Se il limite di blocco viene modificato dopo tale punto, il valore memorizzato nella
cache deve essere aggiornato perché diventi effettivo per tale definizione di commit. Qualsiasi chiamata
dell'API di richiamo di informazioni di commit QTNRCMTI aggiorna il valore memorizzato nella cache
nel lavoro chiamante. Il nuovo valore non si applicherà alle transazioni avviate prima dell'aggiornamento
della cache.
Controllo del commit
27
Eventuali cicli di commit che superano i 2000 blocchi probabilmente rallentano notevolmente le
prestazioni del sistema. Altrimenti, si applicano le stesse considerazioni di blocco valide per le
applicazioni interattive ma il lasso di tempo per cui i record sono bloccati in un'applicazione batch
potrebbe essere meno importante che nelle applicazioni interattive.
Concetti correlati
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
“Gestione della dimensione della transazione” a pagina 75
Un altro modo per ridurre al minimo i blocchi di record consiste nel gestire la dimensione della
transazione.
Riferimenti correlati
Change Query Attributes (CHGQRYA) command
Controllo del commit in due fasi
Il controllo del commit in due fasi assicura che le risorse di cui è possibile eseguire il commit su più
sistemi rimangano sincronizzate.
Il sistema operativo i5/OS supporta il commit in due fasi in base all'architettura SNA LU 6.2. Per
informazioni più dettagliate sui protocolli interni utilizzati dal sistema per il commit in due fasi,
consultare il manuale SNA Transaction Programmer's Reference for LU Type 6.2, GC30-3084-05. Tutte le
release supportate del sistema operativo i5/OS supportano i protocolli Presumed Nothing di SNA LU 6.2
e i protocolli Presumed Abort di SNA LU 6.2.
Il commit in due fasi è supportato anche utilizzando TCP/IP come una protocollo DUW (Distributed
Unit of Work - unità di lavoro distribuita) DRDA (Distributed Relational Database Architecture). Per
utilizzare le connessioni DUW TCP/IP, tutti i sistemi (sia il richiedente dell'applicazione che il server
delle applicazioni) devono essere alla V5R1M0 o successive. Per ulteriori informazioni su DRDA,
consultare l'Open Group Technical Standard, DRDA V2 Vol. 1: Distributed Relational Database Architecture
sul sito Web di The Open Group.
Sotto il commit in due fasi, il sistema esegue l'operazione di commit in due fasi:
v Durante la fase di preparazione, un gestore risorse emette una richiesta di commit al suo gestore
transazioni. Il gestore transazioni informa le altre risorse che gestisce e gli altri gestori transazioni che
la transazione è pronta per essere sottoposta a commit. Tutti i gestori risorse devono rispondere che
sono pronti ad eseguire il commit. Questa è detta decisione.
v Durante la fase di commit, il gestore transazioni che inizia la richiesta di commit decide cosa fare, in
base all'esito della fase di preparazione. Se la fase di preparazione viene completata correttamente e
tutti i partecipanti decidono che sono pronti, il gestore transazioni può indicare a tutte le risorse che
gestisce a agli altri gestori transazioni di eseguire il commit della transazione. Se la fase di
preparazione non viene completata correttamente, a tutti i gestori transazioni e a tutti i gestori risorse
viene indicato di eseguire il rollback della transazione.
Operazioni di commit e rollback con le risorse remote
Quando le risorse remote sono sotto il controllo del commit, l'iniziatore invia una richiesta di commit a
tutti gli agent remoti. La richiesta viene inviata in tutta la rete del programma di transazione. Ciascun
agent risponde con i risultati dell'operazione di commit.
Se si verificano degli errori durante la fase di preparazione, l'iniziatore invia una richiesta di rollback a
tutti gli agent. Se si verificano degli errori durante la fase di commit, il sistema prova a portare il maggior
28
IBM i: Database Controllo del commit
numero di ubicazioni possibile allo stato di sottoposto a commit. Questi tentativi potrebbero determinare
uno stato misto euristico. Consultare la sezione Stati della transazione per il controllo del commit in due
fasi per ulteriori informazioni sugli stati possibili.
Eventuali errori vengono restituiti all'iniziatore dove vengono segnalati all'utente. Se è stato specificato un
giornale predefinito nel comando STRCMTCTL (Avvio controllo commit), vengono scritte le voci C LW.
Se si verificano degli errori, queste voci vengono scritte anche se è stato specificato OMTJRNE(*LUWID).
È possibile utilizzare queste voci, insieme ai messaggi di errore e alle informazioni sullo stato per la
definizione di commit, per provare a sincronizzare manualmente le risorse di cui è possibile eseguire il
commit.
Quando le risorse remote sono sotto il controllo del commit, l'iniziatore invia una richiesta di rollback a
tutti gli agent remoti. La richiesta viene inviata in tutta la rete del programma di transazione. Ciascun
agent risponde con i risultati dell'operazione di rollback.
Concetti correlati
The Open Group Web site
Riferimenti correlati
Start Commitment Control (STRCMTCTL) command
Ruoli nell'elaborazione di commit
Se un commit di una transazione interessa più di un gestore risorse, ciascun gestore risorse ha un ruolo
nella transazione. Un gestore risorse è responsabile per il commit o il rollback delle modifiche apportate
durante la transazione.
I gestori risorse per tipo di risorsa sono i seguenti:
FILE
Database manager
DDM Database manager
DDL
Database manager
DRDA
Programma di transazioni relative alle comunicazioni
LU62
Programma di transazioni relative alle comunicazioni
API
Programma di uscita API
Le seguenti figure mostrano i ruoli di base in una transazione. La struttura mostrata nelle figure è detta
rete programma di transazione. La struttura può trovarsi in un albero a livello singolo e in un albero a più
livelli.
Ruoli nell'elaborazione di commit in due fasi: albero a livello singolo
Quando un'applicazione sul Sistema A emette una richiesta di commit, il gestore risorse sul Sistema A
diventa l'iniziatore. Per l'unità di lavoro distribuita DRDA (Distributed Relational Database Architecture)
su TCP/IP, l'iniziatore viene detto coordinatore.
I gestori risorse per gli altri tre sistemi (B, C e D) diventano agent per questa transazione. Per l'unità di
lavoro distribuita DRDA su TCP/IP, gli agent sono a volte detti partecipanti.
Controllo del commit
29
Ruoli nell'elaborazione di commit in due fasi: albero a più livelli
Se l'applicazione sta utilizzando le comunicazioni APPC per eseguire il commit in due fasi, la relazione
tra i sistemi può cambiare da una transazione alla successiva. La seguente figura mostra gli stessi sistemi
quando un'applicazione sul Sistema B emette la richiesta di commit. Questa configurazione è un albero a
più livelli.
I ruoli in questa figura non sono validi per l'unità di lavoro distribuita DRDA su TCP/IP perché gli alberi
di transazioni a più livelli non sono supportati.
30
IBM i: Database Controllo del commit
La rete del programma di transazione ha un altro livello perché il Sistema B non sta comunicando
direttamente con il Sistema C e il Sistema D. Il gestore risorse nel Sistema A ora ha i ruoli di agent e
iniziatore a cascata.
Per migliorare le prestazioni delle transazioni in due fasi LU 6.2, l'iniziatore può assegnare il ruolo di
ultimo agent a uno degli agent. L'ultimo agent non partecipa alla fase di preparazione. Nella fase di
commit, l'ultimo agent esegue il commit per primo. Se il commit dell'ultimo agent non viene eseguito
correttamente, l'iniziatore indica agli altri agent di eseguire il rollback.
Per l'unità di lavoro distribuita DRDA su TCP/IP, il coordinatore può assegnare il ruolo di server di
risincronizzazione a un partecipante. Il server di risincronizzazione è responsabile per la
risincronizzazione degli altri partecipanti se si verifica un errore nelle comunicazioni con il coordinatore o
se si verifica un errore di sistema per il coordinatore.
Concetti correlati
“Definizione di commit per un commit in due fasi: consentire VRO (vote read-only)” a pagina 35
Di norma, un gestore transazioni partecipa a entrambe le fasi dell'elaborazione di commit. Per migliorare
le prestazioni dell'elaborazione di commit, è possibile configurare qualcuna delle ubicazioni, oppure tutte,
in una transazione per consentire al gestore transazioni di eseguire il VRO (vote read-only).
Stati della transazione per il controllo del commit a due fasi
Una definizione di commit viene stabilita su ciascuna ubicazione che fa parte della rete del programma di
transazione. Per ciascuna definizione di commit, il sistema tiene traccia dello stato della sua transazione
corrente e della transazione precedente.
Controllo del commit
31
Il sistema utilizza lo stato per decidere se eseguire il commit o il rollback se una transazione viene
interrotta da un errore di sistema o nelle comunicazioni. Se più ubicazioni stanno partecipando a una
transazione, gli stati delle transazioni su ciascuna ubicazione potrebbero essere messi a confronto per
determinare l'azione corretta (commit o rollback). Il processo di comunicazione tra le ubicazioni per
determinare l'azione corretta è detto risincronizzazione.
La seguente tabella mostra questi elementi:
v Gli stati di base che possono verificarsi durante una transazione.
v Gli stati aggiuntivi che possono verificarsi.
v Se uno stato richiede la risincronizzazione se la transazione viene interrotta da un errore di sistema o
nelle comunicazioni. I valori possibili sono i seguenti:
Non richiesto
Ciascuna ubicazione può prendere la decisione corretta indipendentemente.
Può essere necessario
Ciascuna ubicazione può prendere la decisione corretta, ma l'iniziatore potrebbe richiedere di
essere informato della decisione.
Richiesto
Lo stato di ciascuna ubicazione deve essere determinato prima che possa essere presa la
decisione corretta.
v Azione eseguita da un errore di sistema o nelle comunicazioni.
Nome stato
Descrizione
Risincronizzazione se la
transazione viene
interrotta
Azione eseguita da un
errore di sistema o nelle
comunicazioni
Stati di base durante l'elaborazione di commit in due fasi:
Ripristinare (RST)
Dal limite di commit fino a
quando il programma
emette una richiesta di
commit o di rollback.
Non necessario.
Viene eseguito il rollback
delle modifiche in sospeso.
Preparazione in corso (PIP)
L'iniziatore ha avviato la
fase di preparazione. Tutte
le ubicazioni non hanno
ancora indicato la loro
decisione.
Potrebbe essere necessaria.
Viene eseguito il rollback
delle modifiche in sospeso.
Preparato (PRP)
Questa ubicazione e tutte le Richiesta.
ubicazioni più in basso
nella rete del programma di
transazione hanno deciso
per il commit. Questa
ubicazione non ha ancora
ricevuto la notifica
dall'iniziatore di eseguire il
commit.
In dubbio. Dipende dai
risultati del processo di
risincronizzazione.
Commit in corso (CIP)
Tutte le ubicazioni hanno
deciso per il commit.
L'iniziatore ha avviato la
fase di commit.
Le modifiche in sospeso
vengono sottoposte a
commit. Viene eseguita la
risincronizzazione per
assicurare che tutte le
ubicazioni abbiano eseguito
il commit. Se viene
notificato un rollback
euristico da un'altra
ubicazione, viene notificato
un errore.
32
IBM i: Database Controllo del commit
Richiesta.
Nome stato
Descrizione
Sottoposto a commit (CMT) Tutti gli agent hanno
eseguito il commit e
restituito una risposta a
questo nodo.
Risincronizzazione se la
transazione viene
interrotta
Azione eseguita da un
errore di sistema o nelle
comunicazioni
Potrebbe essere necessaria.
Nessuna.
Stati aggiuntivi durante l'elaborazione di commit in due fasi:
Ultimo agent in sospeso
(LAP)
Richiesta.
Se viene selezionato un
ultimo agent, questo stato
si verifica presso l'iniziatore
tra lo stato PIP e lo stato
CIP. L'iniziatore ha dato
istruzione all'ultimo agent
di eseguire il commit e non
ha ancora ricevuto una
risposta.
In dubbio. Dipende dai
risultati del processo di
risincronizzazione.
Vote-Read-Only (VRO)
Questo agent ha risposto
alla fase di preparazione
indicando che non ha
modifiche in sospeso. Se è
consentito lo stato VRO
(vote read-only), questo
agent non viene incluso
nella fase di commit.
Potrebbe essere necessaria.
Nessuna.
Rollback richiesto (RBR)
Si è verificato uno dei
seguenti eventi:
Potrebbe essere necessaria.
Viene eseguito il rollback
delle modifiche in sospeso.
v Un agent ha emesso una
richiesta di rollback
prima dell'operazione di
commit.
v Si è verificato un errore
di transazione.
v L'API QTNRBRQD è
stata utilizzata per
mettere la transazione in
uno stato di rollback
richiesto.
Al programma di
transazione non è
consentito eseguire ulteriori
modifiche sotto il controllo
del commit.
Condizioni che si verificano a causa di errori o di azioni dell'operatore:
Rollback forzato
Questa ubicazione e tutte le Potrebbe essere necessaria.
ubicazioni più in basso
nella rete del programma di
transazione, tranne l'ultimo
agent, sono state sottoposte
a rollback per intervento
dell'operatore.
Le modifiche in sospeso
sono già state sottoposte a
rollback.
Controllo del commit
33
Risincronizzazione se la
transazione viene
interrotta
Azione eseguita da un
errore di sistema o nelle
comunicazioni
Nome stato
Descrizione
Commit forzato
Questa ubicazione e tutte le Potrebbe essere necessaria.
ubicazioni più in basso
nella rete del programma di
transazione, tranne l'ultimo
agent, sono state sottoposte
a commit per intervento
dell'operatore.
Le modifiche in sospeso
sono già state sottoposte a
commit.
Euristico misto (HRM)
Alcuni gestori risorse
hanno eseguito il commit.
Alcuni hanno eseguito il
rollback. È stato utilizzato
l'intervento dell'operatore
oppure si è verificato un
errore di sistema. Euristico
misto non compare come
uno stato sulle
visualizzazioni delle
definizioni di commit. Dei
messaggi di notifica
vengono inviati
all'operatore.
Potrebbe essere necessaria.
L'operatore deve eseguire
un'operazione di ripristino
su tutte le ubicazioni
partecipanti per portare il
database a uno stato
congruente.
Concetti correlati
“Definizione di commit per un commit in due fasi: consentire VRO (vote read-only)” a pagina 35
Di norma, un gestore transazioni partecipa a entrambe le fasi dell'elaborazione di commit. Per migliorare
le prestazioni dell'elaborazione di commit, è possibile configurare qualcuna delle ubicazioni, oppure tutte,
in una transazione per consentire al gestore transazioni di eseguire il VRO (vote read-only).
“Definizione di commit per un commit in due fasi: Non attendere risultato” a pagina 37
Quando si verifica un malfunzionamento nelle comunicazioni o di sistema durante un'operazione di
commit, ed è quindi richiesta una risincronizzazione, il valore predefinito prevede di attendere che la
risincronizzazione sia terminata prima di completare l'operazione di commit.
“Avvio del controllo del commit” a pagina 52
Per avviare il controllo del commit, utilizzare il comando STRCMTCTL (Avvio controllo commit).
“Ripristino del controllo del commit durante l'IPL (initial program load) dopo la fine anomala” a pagina
67
Quando si esegue un IPL (initial program load) dopo la fine anomala del sistema, il sistema prova a
ripristinare tutte le definizioni di commit che erano attive quando il sistema è stato terminato.
“Errori del controllo del commit” a pagina 107
Quando si utilizza il controllo del commit, è importante comprendere quali condizioni causano degli
errori e quali no.
Definizioni di commit per il controllo del commit in due fasi
Per modificare le opzioni di commit per la transazione dopo l'avvio del controllo del commit, utilizzare
l'API QTNCHGCO (Modifica opzioni di commit).
In base all'ambiente utilizzato e alle applicazioni utilizzate, la modifica delle opzioni di commit può
migliorare le prestazioni del sistema.
Nota: se si sta utilizzando un'unità di lavoro distribuita DRDA su una connessione TCP/IP, la sola
opzione valida è quella che consente VRO (vote read-only).
34
IBM i: Database Controllo del commit
Riferimenti correlati
Change Commitment Options (QTNCHGCO) API
Definizione di commit per un commit in due fasi: consentire VRO (vote read-only):
Di norma, un gestore transazioni partecipa a entrambe le fasi dell'elaborazione di commit. Per migliorare
le prestazioni dell'elaborazione di commit, è possibile configurare qualcuna delle ubicazioni, oppure tutte,
in una transazione per consentire al gestore transazioni di eseguire il VRO (vote read-only).
Se l'ubicazione non ha modifiche di cui è possibile eseguire il commit durante una transazione, il gestore
transazioni esegue il VRO (vote read-only) durante la fase di preparazione. L'ubicazione non partecipa
alla fase di commit. Questo migliora le prestazioni generali perché i flussi di comunicazioni che di norma
si verificano durante la fase di commit vengono eliminati durante le transazioni in cui non viene eseguito
alcun aggiornamento su una o più ubicazioni remote.
Dopo aver avviato il controllo del commit, è possibile utilizzare l'API QTNCHGCO (Modifica opzioni di
commit) per modificare l'opzione VRO (Vote read only) consentito in Y. È possibile eseguire questa
operazione se ricorrono le seguenti condizioni:
v Spesso uno o più sistemi remoti non hanno alcuna modifica di cui è possibile eseguire il commit per
una transazione.
v Una transazione non dipende da dove il cursore del file (record successivo) è stato impostato dalla
transazione precedente. Quando un'ubicazione dà un'indicazione di VRO (vote read-only),
l'applicazione non viene mai informata se viene eseguito il rollback della transazione. L'ubicazione ha
eseguito il commit delle operazioni di lettura con i file del database e, pertanto, ha spostato la
posizione del cursore. La posizione del cursore del file è di norma importante solo se si esegue
un'elaborazione sequenziale.
Se la definizione di commit è impostata per consentire VRO (vote read-only), l'applicazione attende il
successivo flusso di messaggi da un'altra ubicazione.
L'opzione VRO (Vote read only) consentito è progettata per le applicazioni con una natura client/server.
Se il solo scopo del programma A è soddisfare le richieste dal programma I e non di eseguire del lavoro
indipendente, è appropriato consentire l'opzione VRO (vote read-only) per il programma A.
Flusso di elaborazione di commit senza l'ottimizzazione di ultimo agent quando l'agent dà
un'indicazione di VRO (vote read-only)
La seguente figura mostra il flusso di messaggi tra i programmi applicativi e i gestori transazioni quando
un programma applicativo emette un'istruzione di commit senza l'ottimizzazione di ultimo agent quando
l'agent dà come indicazione VRO (vote read-only). Né il programma applicativo iniziatore né i
programmi applicativi agent rilevano l'elaborazione di commit in due fasi. I numeri tra parentesi () nella
figura corrispondono agli elementi numerati nella descrizione successiva.
Controllo del commit
35
Il seguente elenco è una descrizione degli eventi per l'elaborazione normale senza l'ottimizzazione di
ultimo agent quando l'agent dà l'indicazione di VRO (vote read-only). È rappresentata la descrizione di
un flusso di base. La sequenza di eventi può diventare molto più complessa quando la rete del
programma di transazione ha più livelli o quando si verificano degli errori.
1. Il programma applicativo A esegue un'operazione di ricezione richiesta per indicare che è pronto a
ricevere una richiesta dal programma I.
2. L'applicazione iniziatore (I) emette un'istruzione di commit.
3. Il gestore transazioni per l'iniziatore (TM-I) assume il ruolo di iniziatore per questa transazione. Avvia
la fase di preparazione inviando un messaggio di preparazione a tutte le altre ubicazioni che stanno
partecipando alla transazione.
4. I gestori transazioni per tutte le altre ubicazioni assumono il ruolo di agent (TM-A). Il programma
applicativo A viene informato da TM-A che è stata ricevuta una richiesta di commit. Per i file ICF, la
notifica consiste nell'impostazione come attivo dell'indicatore ICF di ricezione di un'esecuzione di
commit (RCVTKCMT).
5. Il programma applicativo A risponde immettendo un'istruzione di commit (o un'istruzione di
rollback). Questa è la decisione del programma applicativo.
6. Se il programma applicativo A ha utilizzato l'API QTNCHGCO (Modifica opzioni di commit) per
impostare l'opzione di commit VRO (Vote read only) consentito su Y e non è stata apportata alcuna
modifica all'agent durante la transazione, l'agent (TM-A) risponde all'iniziatore (TM-I) con un
messaggio di reimpostazione. Non c'è alcuna fase di commit per l'agent.
7. Una restituzione viene inviata al programma applicativo (A) per indicare che la transazione è
completa presso l'agent TM-A.
8. La volta successiva che l'iniziatore (TM-I) invia un messaggio all'agent (TM-A), sia esso un flusso di
dati o un'istruzione di commit, TM-I fa in modo che il suo ID transazione corrente venga inviato con
il messaggio. Questo è dovuto al fatto che un nuovo ID transazione potrebbe essere stato generato
presso il TM-I se si era verificato un errore nelle comunicazioni tra il TM-I e un altro sistema durante
l'operazione di commit.
36
IBM i: Database Controllo del commit
9. Una restituzione viene inviata al programma applicativo (A) per indicare che la transazione è
completa presso l'agent TM-A. La restituzione viene ritardata fino a dopo la ricezione del successivo
messaggio perché il TM-I deve ricevere un nuovo ID transazione prima che l'applicazione A possa
avviare la successiva transazione.
Concetti correlati
“Ruoli nell'elaborazione di commit” a pagina 29
Se un commit di una transazione interessa più di un gestore risorse, ciascun gestore risorse ha un ruolo
nella transazione. Un gestore risorse è responsabile per il commit o il rollback delle modifiche apportate
durante la transazione.
“Stati della transazione per il controllo del commit a due fasi” a pagina 31
Una definizione di commit viene stabilita su ciascuna ubicazione che fa parte della rete del programma di
transazione. Per ciascuna definizione di commit, il sistema tiene traccia dello stato della sua transazione
corrente e della transazione precedente.
“Ottimizzazione delle prestazioni per il controllo del commit” a pagina 71
L'utilizzo del controllo del commit richiede delle risorse che possono influenzare le prestazioni del
sistema. Diversi fattori influenzano le prestazioni del sistema relativamente al controllo del commit.
Riferimenti correlati
Change Commitment Options (QTNCHGCO) API
Definizione di commit per un commit in due fasi: Non attendere risultato:
Quando si verifica un malfunzionamento nelle comunicazioni o di sistema durante un'operazione di
commit, ed è quindi richiesta una risincronizzazione, il valore predefinito prevede di attendere che la
risincronizzazione sia terminata prima di completare l'operazione di commit.
Nota: l'opzione Non attendere risultato non si applica se si sta utilizzando un'unità di lavoro distribuita
DRDA (Distributed Relational Database Architecture) su una connessione TCP/IP. L'unità di lavoro
distribuita DRDA su connessioni TCP/IP non attende mai il risultato.
Prendere in considerazione la possibilità di modificare questa modalità di funzionamento se ricorrono le
seguenti condizioni:
v Le applicazioni che partecipano sono indipendenti l'una dall'altra.
v La logica di programma non richiede i risultati delle transazioni precedenti per assicurare che i file di
database rimangano sincronizzati.
Dopo aver avviato il controllo del commit, è possibile utilizzare l'API QTNCHGCO (Modifica opzioni di
commit) per specificare che la definizione di commit non attende il risultato della risincronizzazione. Se si
specifica N (No) per l'opzione Attesa risultato, il sistema utilizza un lavoro del server di database
(QDBSRVnn) per gestire la risincronizzazione in modo asincrono.
Nota: questi lavori del server di database vengono avviati durante il processo IPL (initial program load caricamento iniziale di programma). L'eventuale modifica delle opzioni per il controllo del commit
non influenza il numero di lavori avviato dal sistema.
Questo argomento fa riferimento solo ai due valori per l'opzione Attesa risultato risolta, Y (Sì) e N
(No). Ci sono effettivamente altri due valori che è possibile specificare, L (Sì o Eredita da iniziatore) e U
(No o Eredita da iniziatore). Quando si utilizzano questi valori, il valore effettivo utilizzato durante
ciascuna operazione di commit viene risolto in Sì o No dal sistema. L'argomento relativo all'API
QTNCHGCO (Modifica opzioni di commit) contiene maggiori dettagli su questi valori.
Nota: il valore dell'iniziatore può essere ereditato solo da un agent se sia l'iniziatore sia l'agent
supportano la presunta fine anomala.
Controllo del commit
37
L'opzione WFO (wait for outcome, ossia attendere risultato) non influenza la normale elaborazione di
commit che non presenta errori. Se si verifica un errore, l'opzione WFO determina se l'applicazione
attende la risincronizzazione o meno, con le seguenti condizioni:
v Se l'opzione WFO risolta è Y (Sì), l'applicazione attende il risultato della risincronizzazione.
v Se l'opzione WFO risolta è N (No) e si verifica un errore nelle comunicazioni durante la fase di
preparazione o il rollback di un'ubicazione che supporta i protocolli di presunta fine anomala, non
viene eseguita alcuna risincronizzazione e la definizione di commit viene sottoposta a rollback.
v Se la definizione di commit è in dubbio (lo stato della transazione è Preparato o Ultimo agent in
sospeso), l'applicazione attenderà il risultato della risincronizzazione indipendentemente dal valore
dell'opzione WFO risolta.
v Se l'opzione WFO risolta è N e non ricorre né la condizione due né quella tre, il sistema prova ad
eseguire la risincronizzazione una sola volta. Se l'operazione non viene eseguita con esito positivo, il
sistema segnala il messaggio di STATO CPF83E6 all'applicazione per indicare che la risincronizzazione
è in corso.
Poiché CPF83E6 è un messaggio di STATO, ha un effetto solo se l'applicazione ne sta monitorando
l'emissione. Di norma, l'applicazione può elaborare questo messaggio come un messaggio informativo.
I sistemi che stanno partecipando al tentativo di transazione provano a risincronizzare la transazione
finché l'errore non viene corretto. Questi tentativi di risincronizzazione successivi vengono eseguiti nei
lavori del server di database. Se un successivo tentativo di risincronizzazione eseguito in un lavoro del
server di database ha esito negativo, il messaggio CPI83D0 viene inviato a QSYSOPR.
Valore di Attendi risultato: Sì
Nella seguente figura, la definizione di commit per l'iniziatore (I) utilizza il valore predefinito di Y (Sì)
per l'opzione Attendi risultato. Quando le comunicazioni tra TM-I e TM-A si interrompono, sia
l'applicazione A sia l'applicazione I attendono che la transazione venga risincronizzata.
38
IBM i: Database Controllo del commit
Valore di Attendi risultato: No
Nella seguente figura, la definizione di commit per l'iniziatore ha l'opzione WFO risolta impostata su N
(No). TM-A soddisfa la condizione 3 nell'elenco precedente, mentre TM-I soddisfa la condizione 4. Il
controllo viene restituito all'applicazione I dopo un tentativo di risincronizzazione con TM-A. Un lavoro
del server di database prova ad eseguire la risincronizzazione. L'applicazione I non riceve mai l'indicatore
di restituzione dopo il corretto completamento della richiesta di commit. Il controllo viene restituito
all'applicazione agent (A) solo dopo che le comunicazioni sono state ristabilite. Questo dipende da
quando si verifica l'errore. In questo caso, l'errore nelle comunicazioni si verifica prima che l'iniziatore
riceva il messaggio di commit, lasciando TM-A in dubbio se eseguire il commit o il rollback. Quando è in
dubbio, il gestore transazioni conserva il controllo finché la risincronizzazione non viene completata,
indipendentemente dal valore dell'opzione WFO risolta per tale sistema.
Se si desidera che le applicazioni su tutti i sistemi continuino prima che venga completata la
risincronizzazione, è necessario modificare l'opzione WFO risolta in N (No) su tutti i sistemi oppure
impostare l'iniziatore su N e il resto dei sistemi su U (No o Eredita da iniziatore). Tenere tuttavia presente
che l'opzione WFO risolta viene ignorata quando il gestore transazioni è in dubbio se eseguire il commit
o il rollback e attende sempre che la risincronizzazione venga completata prima di restituire il controllo.
Controllo del commit
39
Quando viene stabilita una connessione a un database relazionale remoto, e non sono già state avviate
delle conversazioni protette, il sistema modifica in modo implicito il valore Attendi risultato in N.
Questo è dovuto al fatto che le prestazioni delle operazioni di commit sono migliori quando il valore
Attendi risultato è N e il sistema remoto supporta la presunta fine anomala. Questa modifica implicita
del valore Attendi risultato viene eseguita solo per le applicazioni DDM e DRDA. Le applicazioni
APPC utilizzano il valore predefinito Attendi risultato di Y a meno che non richiamino l'API
QTNCHGCO per modificarlo.
40
IBM i: Database Controllo del commit
Concetti correlati
“Stati della transazione per il controllo del commit a due fasi” a pagina 31
Una definizione di commit viene stabilita su ciascuna ubicazione che fa parte della rete del programma di
transazione. Per ciascuna definizione di commit, il sistema tiene traccia dello stato della sua transazione
corrente e della transazione precedente.
“Errori del controllo del commit” a pagina 107
Quando si utilizza il controllo del commit, è importante comprendere quali condizioni causano degli
errori e quali no.
Riferimenti correlati
Change Commitment Options (QTNCHGCO) API
Definizione di commit per un commit in due fasi: indicazione di OK tralasciare:
Di norma, il gestore transazioni in qualsiasi ubicazione nella rete del programma di transazione partecipa
a ogni operazione di commit o di rollback. Per migliorare le prestazioni, è possibile configurare qualcuna
o tutte le ubicazioni in una transazione per consentire al gestore transazioni di indicare che è OK
tralasciare.
Nota: l'opzione OK tralasciare non si applica se si sta utilizzando un'unità di lavoro distribuita DRDA
sulla connessione TCP/IP.
Se nessun flusso di comunicazioni viene inviato all'ubicazione durante una transazione, l'ubicazione viene
omessa quando viene eseguita un'operazione di commit o di rollback. Questo migliora le prestazioni
generali perché i flussi di comunicazioni che di norma si verificano durante il commit o il rollback
vengono eliminati durante le transazioni in cui nessun dato viene inviato a una o più ubicazioni remote.
Dopo aver avviato il controllo del commit, è possibile utilizzare l'API QTNCHGCO (Modifica opzioni di
commit) per modificare l'opzione OK tralasciare in Y (Sì). È possibile eseguire questa operazione se uno o
più sistemi remoti spesso non sono coinvolti in una transazione.
Se la definizione di commit è configurata per indicare che è OK tralasciare, l'applicazione attende il
successivo flusso di messaggi da un'altra ubicazione.
L'opzione che indica che è OK tralasciare è progettata per le applicazioni con una natura client/server. Se
il solo scopo del programma A è soddisfare le richieste dal programma I e non di eseguire del lavoro
indipendente, è appropriato consentire l'opzione che indica che è OK tralasciare per il programma A.
Flusso di elaborazione di commit senza l'ottimizzazione di ultimo agent quando l'agent dà
un'indicazione di OK tralasciare
La seguente figura mostra il flusso di messaggi tra i programmi applicativi e i gestori transazioni quando
un programma applicativo emette un'istruzione di commit senza l'ottimizzazione di ultimo agent quando
l'agent dà come indicazione OK tralasciare. Sia il programma applicativo iniziatore sia i programmi
applicativi agent non rilevano l'elaborazione di commit in due fasi. I numeri tra parentesi () nella figura
corrispondono agli elementi numerati nella descrizione successiva.
Controllo del commit
41
Viene qui di seguito riportata una descrizione degli eventi per l'elaborazione normale senza
l'ottimizzazione di ultimo agent quando l'agent dà l'indicazione di OK tralasciare. È rappresentata la
descrizione di un flusso di base. La sequenza di eventi può diventare molto più complessa quando la rete
del programma di transazione ha più livelli o quando si verificano degli errori.
1. Il programma applicativo A esegue un'operazione di ricezione richiesta per indicare che è pronto a
ricevere una richiesta dal programma I.
2. L'applicazione iniziatore (I) emette un'istruzione di commit.
3. Il gestore transazioni per l'iniziatore (TM-I) assume il ruolo di iniziatore per questa transazione.
Avvia la fase di preparazione inviando un messaggio di preparazione a tutte le altre ubicazioni che
stanno partecipando alla transazione.
4. I gestori transazioni per tutte le altre ubicazioni assumono il ruolo di agent (TM-A). Il programma
applicativo A viene informato da TM-A che è stata ricevuta una richiesta di commit. Per i file ICF, la
notifica consiste nell'impostazione dell'indicatore ICF di ricezione di un'esecuzione di commit
(RCVTKCMT).
5. Il programma applicativo A risponde immettendo un'istruzione di commit (o un'istruzione di
rollback). Questa è la decisione del programma applicativo.
6. Se il programma applicativo A ha utilizzato l'API QTNCHGCO (Modifica opzioni di commit) per
impostare l'opzione di commit OK tralasciare su Y, viene inviato un indicatore quando l'agent
(TM-A) risponde all'iniziatore (TM-I) con un messaggio di richiesta di commit.
42
IBM i: Database Controllo del commit
Nota: qualsiasi modifica all'opzione di commit OK tralasciare non diventa effettiva fino alla
successiva operazione di commit eseguita correttamente.
7. Quando l'iniziatore (TM-I) riceve tutte le decisioni, il TM-I invia un messaggio di commit. Questo
avvia la fase di commit.
8. Ciascun agent (TM-A) esegue il commit e risponde con un messaggio di reimpostazione.
9. Una restituzione viene inviata al programma applicativo (I) per indicare che la transazione è
completa presso l'iniziatore.
10. Su TM-I può verificarsi qualsiasi numero di transazioni, nessuna delle quali richiede delle modifiche
a TM-A o dati da TM-A. TM-A non è incluso in queste transazioni.
11. La volta successiva che l'iniziatore (TM-I) invia un messaggio all'agent (A), un nuovo ID transazione
viene inviato con il messaggio. Se l'iniziatore esegue qualche operazione di commit o di rollback
prima di inviare un messaggio all'agent, nessun messaggio viene inviato all'agent durante queste
operazioni (l'agent viene "escluso" da questi commit o rollback). Poiché una o più transazioni
potrebbero essere state sottoposte a commit o rollback presso l'iniziatore mentre l'agent era escluso,
l'iniziatore deve comunicare il suo ID transazione corrente quando viene inviato il messaggio
successivo all'agent.
12. Una restituzione viene inviata al programma applicativo (A) per indicare che il commit originario è
completo e che sta partecipando alla transazione corrente.
Concetti correlati
“Ottimizzazione delle prestazioni per il controllo del commit” a pagina 71
L'utilizzo del controllo del commit richiede delle risorse che possono influenzare le prestazioni del
sistema. Diversi fattori influenzano le prestazioni del sistema relativamente al controllo del commit.
Definizione di commit per un commit in due fasi: non selezione di un ultimo agent:
Per impostazione predefinita, il gestore transazioni per l'iniziatore può selezionare qualsiasi agent come
un ultimo agent durante un'operazione di commit.
Nota: l'opzione che indica di non selezionare l'ultimo agent non è valida se si sta utilizzando l'unità di
lavoro distribuita DRDA su una connessione TCP/IP.
Nel caso di un albero a più livelli, qualsiasi agent selezionato come ultimo agent dal suo iniziatore può
anche selezionare un proprio ultimo agent. Le prestazioni sono migliorate quando un ultimo agent viene
selezionato durante l'operazione di commit perché i due flussi di comunicazioni vengono eliminati tra un
iniziatore e il suo ultimo agent (la fase di preparazione viene eliminata per questi sistemi).
Tuttavia, quando invia la richiesta di commit al suo ultimo agent, l'iniziatore deve attendere finché non
avrà ricevuto la decisione dell'ultimo agent prima di poter continuare. Questo è indipendente dal valore
di Attesa risultato per la definizione di commit. Durante la normale elaborazione di commit senza errori,
questo non è un problema. Se però si verifica un errore durante questo intervallo di tempo, l'iniziatore
non può continuare finché non sarà stata completata la risincronizzazione. Se l'applicazione iniziatore sta
gestendo richieste da un utente a un terminale, questa può essere una considerazione di utilizzabilità.
È necessario considerare se delle prestazioni migliorate durante le normali operazioni di commit sono più
importanti dell'impatto sull'utilizzabilità quando si verifica un errore di questo tipo. Nota: se l'errore si
verifica prima che la richiesta di commit venga inviata all'ultimo agent, la LUW (Logical Unit of Work unità di lavoro logica) eseguirà immediatamente il rollback e l'iniziatore non attenderà. Pertanto,
l'intervallo di tempo durante il quale un errore può causare una condizione di attesa per l'iniziatore è
abbastanza piccolo e, pertanto, un errore di questo tipo è raro.
Se si decide che l'impatto sull'utilizzabilità è eccessivo rispetto al miglioramento delle prestazioni
ottenuto, è possibile modificare le definizioni di commit per non selezionare un ultimo agent. Dopo aver
avviato il controllo del commit, è possibile utilizzare l'API QTNCHGCO (Modifica opzioni di commit) per
modificare l'opzione Ultimo agent consentito in N.
Controllo del commit
43
Riferimenti correlati
Change Commitment Options (QTNCHGCO) API
Effetto della decisione affidabile sul flusso di elaborazione di commit:
La decisione affidabile è un'ottimizzazione che migliora le prestazioni velocizzando la restituzione
all'applicazione iniziatore dopo un'operazione di commit ed eliminando un messaggio durante
un'operazione di commit.
Non esiste alcuna ottimizzazione di decisione affidabile esplicita per l'unità di lavoro distribuita DRDA
(Distributed Relational Database Architecture) su TCP/IP. Tuttavia, il sistema operativo i5/OS non
richiede mai una conferma di reimpostazione (ignora) per le connessioni TCP/IP. Pertanto, una
reimpostazione (ignora) è sempre implicita per le connessioni TCP/IP.
Dopo aver avviato il controllo del commit, è possibile utilizzare l'API QTNCHGCO (Modifica opzioni di
commit) per modificare l'opzione Accettazione decisione affidabile in Y.
Si può pensare alla decisione affidabile come a una promessa da parte di un agent al suo iniziatore che
non verranno prese decisioni euristiche presso l'agent se si verifica un errore nelle comunicazioni mentre
l'agent è in dubbio. Un agent che sta utilizzando l'ottimizzazione di decisione affidabile invia un
indicatore all'iniziatore durante la fase di preparazione del commit. Se anche l'iniziatore sta utilizzando
l'ottimizzazione di decisione affidabile, esso invia un indicatore all'agent che non è richiesta alcuna
reimpostazione in risposta al messaggio di commit. Questo elimina il messaggio di reimpostazione e
consente al gestore transazioni di eseguire la restituzione all'applicazione presso l'iniziatore appena viene
inviato il messaggio di commit.
Prendere in considerazione la possibilità di utilizzare l'ottimizzazione di decisione affidabile se ricorrono
le seguenti condizioni:
v È improbabile che venga presa una decisione euristica presso un agent in dubbio se si verifica un
errore di sistema o nelle comunicazioni a meno che l'errore non possa essere riparato.
v La logica di programma non richiede i risultati delle transazioni precedenti per assicurare che i file di
database rimangano sincronizzati.
L'ottimizzazione di decisione affidabile viene utilizzata dal sistema operativo i5/OS solo se ricorrono
tutte le seguenti condizioni:
v Le ubicazioni iniziatore e agent supportano il livello di presunta fine anomala del controllo del commit.
v L'ubicazione iniziatore accetta l'indicazione di decisione affidabile dall'agent. Sugli iniziatori i5/OS,
questo dipende dal valore delle due opzioni di commit:
– Il valore dell'opzione di commit Attesa risultato deve essere N (Sì è il valore predefinito).
– Il valore dell'opzione di commit Accettazione decisione affidabile deve essere Sì (Sì è il valore
predefinito).
v L'ubicazione dell'agent dà un'indicazione di decisione affidabile durante la fase di preparazione. Gli
agent i5/OS danno sempre un'indicazione di decisione affidabile. Questo è dovuto al fatto che le
decisioni euristiche possono essere prese solo tramite una procedura manuale che avverte dei possibili
effetti collaterali negativi che esse comportano.
Flusso di elaborazione di commit con l'ottimizzazione di decisione affidabile
La seguente figura mostra il flusso di messaggi tra i programmi applicativi e i gestori transazioni quando
viene utilizzata l'ottimizzazione di decisione affidabile. Sia il programma applicativo iniziatore sia i
programmi applicativi agent non rilevano l'elaborazione di commit in due fasi. I numeri tra parentesi ()
nella figura corrispondono agli elementi numerati nella descrizione successiva.
44
IBM i: Database Controllo del commit
Il seguente elenco descrive gli eventi per l'elaborazione normale senza l'ottimizzazione di ultimo agent
quando l'agent dà l'indicazione di decisione affidabile. È rappresentata la descrizione di un flusso di base.
La sequenza di eventi può diventare molto più complessa quando la rete del programma di transazione
ha più livelli o quando si verificano degli errori.
1. Il programma applicativo A esegue un'operazione di ricezione richiesta per indicare che è pronto a
ricevere una richiesta dal programma I.
2. L'applicazione iniziatore (I) emette un'istruzione di commit.
3. Il gestore transazioni per l'iniziatore (TM-I) assume il ruolo di iniziatore per questa transazione. Avvia
la fase di preparazione inviando un messaggio di preparazione a tutte le altre ubicazioni che stanno
partecipando alla transazione.
4. I gestori transazioni per tutte le altre ubicazioni assumono il ruolo di agent (TM-A). Il programma
applicativo A viene informato da TM-A che è stata ricevuta una richiesta di commit. Per i file ICF, la
notifica consiste nell'impostazione dell'indicatore ICF di ricezione di un'esecuzione di commit
(RCVTKCMT).
5. Il programma applicativo A risponde immettendo un'istruzione di commit (o un'istruzione di
rollback). Questa è la decisione del programma applicativo.
6. L'agent (TM-A) risponde all'iniziatore (TM-I) con un messaggio di richiesta di commit. I sistemi i5/OS
un indicatore affidabile di voto con la richiesta di commit.
7. Quando l'iniziatore (TM-I) riceve tutte le decisioni, il TM-I invia un messaggio di commit. Se l'opzione
di commit Attesa risultato è N (No) e l'opzione di commit Accettazione decisione affidabile è Y (Sì),
con il messaggio di commit viene inviato un indicatore di non reimpostazione. Questo indica all'agent
che non è richiesto alcun messaggio di reimpostazione in risposta al commit.
Controllo del commit
45
8. La transazione è completa. Una restituzione viene inviata ai programmi applicativi (I e A). Questa
restituzione indica che l'operazione di commit è stata eseguita correttamente. Se si verifica un danno
euristico sul sistema A dovuto a una decisione euristica presa prima che fosse ricevuto il messaggio di
commit eseguito, l'applicazione I non viene informata. Viene invece inviato un messaggio alla coda
messaggi QSYSOPR. Tuttavia, l'applicazione A riceve l'indicazione di danno euristico.
9. La vota successiva che l'agent (TM-A) invia un messaggio all'iniziatore (TM-I), sia esso un flusso di
dati o un'istruzione di commit, un indicatore di reimpostazione implicita viene inviato insieme al
messaggio per informare TM-I che TM-A ha completato il commit correttamente. Questo è dovuto al
fatto che TM-I deve conservare le informazioni sulla transazione completata finché non conferma che
TM-A ha ricevuto correttamente il messaggio di commit nel passo 7 a pagina 45
Riferimenti correlati
Change Commitment Options (QTNCHGCO) API
Supporto delle transazioni XA per il controllo del commit
DB2 for i può partecipare nelle transazioni globali X/Open.
The Open Group ha definito un modello standard del settore per il lavoro transazionale che consente a
modifiche apportate a risorse non correlate di far parte di una singola transazione globale. Un esempio è
rappresentato da modifiche ai database forniti da due fornitori separati. Questo modello è detto modello
X/Open Distributed Transaction Processing.
Le seguenti pubblicazioni descrivono in modo dettagliato il modello X/Open Distributed Transaction
Processing:
v X/Open Guide, February 1996, Distributed Transaction Processing: Reference Model, Version 3
(ISBN:1-85912-170-5, G504), The Open Group.
v X/Open CAE Specification, December 1991, Distributed Transaction Processing: The XA Specification
(ISBN:1-872630-24-3, C193 o XO/CAE/91/300), The Open Group.
v X/Open CAE Specification, April 1995, Distributed Transaction Processing: The TX (Transaction
Demarcation) Specification (ISBN:1-85912-094-6, C504), The Open Group.
È necessario avere dimestichezza con le informazioni contenute in questi manuali, in particolar modo con
la specifica XA, prima di provare a utilizzare il supporto delle transazioni XA fornito da DB2 for i. Questi
manuali sono disponibili sul sito Web della The Open Group.
Il modello DTP (distributed transaction processing) presenta cinque componenti:
AP (application program, ossia programma applicativo)
Implementa la funzione richiesta dell'utente specificando una sequenza di operazioni che
coinvolge risorse come ad esempio i database. Definisce l'inizio e la fine delle transazioni globali,
accede alle risorse nei limiti delle transazioni e, di norma, decide se eseguire il commit o il
rollback di ciascuna transazione.
TM (transaction manager, ossia gestore transazioni)
Gestisce le transazioni globali e coordina la decisione di avviarle e di eseguirne il commit, o di
eseguirne il rollback per assicurare il completamento della transazione atomica (indivisibile). Il
TM coordina anche le attività di ripristino con gli RM dopo il malfunzionamento di un
componente.
RM (resource manager, ossia gestore risorse)
Gestisce una parte definita delle risorse condivise del computer, come ad esempio un sistema di
gestione del database. L'AP utilizza interfacce definite da ogni RM per eseguire il lavoro
transazionale. Il TM utilizza le interfacce fornite dall'RM per eseguire il completamento della
transazione.
46
IBM i: Database Controllo del commit
CRM (communications resource manager)
Consente a un'istanza del modello di accedere a un'altra istanza interna o esterna al dominio TM
corrente. I CRM non rientrano nell'ambito di DB2 for i e non sono trattati in questa
pubblicazione.
Protocollo per le comunicazioni
I protocolli sono utilizzati dai CRM per comunicare tra loro. Questo non rientra nell'ambito di
DB2 for i e non è trattato in questa pubblicazione.
La specifica XA è la parte del modello DTP che descrive un set di interfacce utilizzato dai componenti
TM ed RM del modello DTP. DB2 for i implementa queste interfacce come un set di programmi di uscita
e di API in stile piattaforma UNIX®. Consultare API XA per una documentazione dettagliata di queste
API e per ulteriori informazioni su come utilizzare DB2 for i come un RM.
System i Navigator e le transazioni XA
System i Navigator supporta la gestione di transazioni XA come transazioni globali.
Una transazione globale può contenere modifiche sia esterne sia interne a DB2 for i. Una transazione
globale è coordinata da un gestore transazioni esterno che utilizza l'architettura Open Group XA o
un'altra architettura simile. Un'applicazione esegue il commit o il rollback di una transazione globale
utilizzando le interfacce fornite dal gestore transazioni. Il gestore transazioni utilizza protocolli di commit
definiti dall'architettura XA, o da un'altra architettura, per completare la transazione. DB2 for i funge da
gestore risorse XA quando partecipa a una transazione globale. Esistono due tipi di transazioni globali:
v Blocchi nell'ambito della transazione: i blocchi acquisiti per conto della transazione sono inclusi
nell'ambito della transazione. La transazione può spostarsi da un lavoro o un sottoprocesso ad un altro.
v Blocchi nell'ambito del lavoro: i blocchi acquisiti per conto della transazione sono inclusi nell'ambito
del lavoro. La transazione non può spostarsi dal lavoro che l'ha avviata.
Considerazioni per le transazioni XA
Le API XA per i blocchi nell'ambito della transazione sono consigliate per i nuovi utenti del supporto
delle transazioni XA. Le API XA per i blocchi nell'ambito del lavoro continueranno a essere supportate
ma non presenteranno più alcun vantaggio rispetto alle API XA per i blocchi nell'ambito della
transazione. Le API XA per i blocchi nell'ambito della transazione presentano meno limitazioni e offrono
migliori prestazioni nelle seguenti situazioni:
v Se vengono utilizzate più connessioni SQL per gestire un singolo ramo transazione XA.
v Se viene utilizzata una singola connessione SQL per gestire più rami transazione XA simultanei.
In queste situazioni, è necessario avviare un lavoro separato per eseguire i rami transazione XA quando si
utilizzano le API XA per i blocchi nell'ambito del lavoro.
Leggere attentamente le seguenti considerazioni e comprendere le seguenti limitazioni prima di utilizzare
DB2 for i come un RM. Il termine sottoprocesso fa riferimento a un lavoro che non ha capacità di
sottoprocesso oppure a un singolo sottoprocesso in un lavoro con capacità di sottoprocesso.
Le seguenti considerazioni sono valide sia per le transazioni con i blocchi nell'ambito della transazione
sia per le transazioni con i blocchi nell'ambito del lavoro, se non diversamente indicato.
Considerazioni su DB2 for i
v Le transazioni XA su un database locale devono essere eseguite in lavori in esecuzione in modalità
server SQL. Per questo tipo di transazioni, se viene utilizzata l'API xa_open() o db2xa_open() in un
lavoro che non è già in esecuzione in modalità server SQL, la modalità server SQL viene avviata in
modo implicito. È possibile fare riferimento a API XA per le limitazioni sulle interfacce di database
supportate.
Controllo del commit
47
v
le transazioni XA su un database remoto devono utilizzare la modalità server SQL quando si
utilizzano le API XA per i blocchi nell'ambito del lavoro. Tuttavia, la modalità server è facoltativa per
le transazioni XA su un database remoto quando si utilizzano le API XA per i blocchi nell'ambito della
transazione. Inoltre, le modifiche ai file DDM utilizzando i classici metodi di accesso al database i5/OS
sono consentite nelle transazioni XA su un database remoto quando non viene utilizzata la modalità
server SQL.
v Durante i richiami di API XA, la specifica XA notifica eventuali errori rilevati da DB2 for i tramite i
codici di ritorno. I messaggi di diagnostica vengono lasciati nella registrazione lavoro quando non è
possibile determinare il significato dell'errore dal solo codice di ritorno.
Considerazioni sull'SQL incorporato
v Per utilizzare una connessione SQL (Structured Query Language) per le transazioni XA, è necessario
utilizzare l'API (application programming interface) xa_open() o db2xa_open() prima che venga
stabilita la connessione SQL. Il database relazionale con il quale verrà stabilita la connessione deve
essere trasmesso all'API xa_open() o db2xa_open() dal parametro xainfo. Il profilo utente e la parola
d'ordine da utilizzare nel lavoro cui viene instradata la connessione potrebbero essere trasmessi all'API
xa_open() o db2xa_open(). Se non viene trasmesso, il profilo utilizzato è quello che è stato specificato o
utilizzato come predefinito durante il tentativo di connessione.
Nota: la seguente considerazione è valida solo per le transazioni con blocchi nell'ambito del lavoro.
v Se per eseguire le transazioni XA viene utilizzato l'SQL incorporato, il lavoro eseguito per ciascuna
connessione viene instradato a un lavoro differente, anche se le connessioni vengono stabilite nello
stesso sottoprocesso. Questo è diverso dalla modalità server SQL senza XA, dove il lavoro eseguito per
tutte le connessioni in un singolo sottoprocesso viene instradato allo stesso lavoro. Questo è dovuto al
fatto che la specifica XA richiede una chiamata di preparazione, commit o rollback separata per
ciascuna istanza del gestore risorse.
Nota: la seguente considerazione è valida solo per le transazioni con blocchi nell'ambito del lavoro.
v Se per eseguire le transazioni XA viene utilizzato l'SQL incorporato, è possibile stabilire una sola
connessione per database relazionale per sottoprocesso. Quando il sottoprocesso non è attivamente
associato a un ramo transazione, il lavoro richiesto su una delle connessioni del sottoprocesso farà sì
che l'RM utilizzi il programma di uscita del TM ax_reg() per determinare se il lavoro consiste
nell'avviare, riprendere o eseguire l'unione a un ramo transazione.
Se il lavoro consiste nell'avviare un ramo transazione, esso viene eseguito sulla connessione di tale
sottoprocesso al database relazionale corrispondente.
Se il lavoro consiste nell'unirsi a un ramo transazione, esso viene reinstradato sulla connessione al
database relazionale corrispondente di cui era stata eseguita la creazione nel sottoprocesso che ha
avviato il ramo transazione. Notare che il sistema non impone che il profilo utente per la connessione
sia uguale a quello per la connessione del sottoprocesso di unione. È responsabilità del TM assicurarsi
che questo non rappresenti un problema per la sicurezza. I tipici TM utilizzano lo stesso profilo utente
per tutte le connessioni. Questo profilo utente è autorizzato a tutti i dati gestiti dal TM. Ulteriori
misure di sicurezza relative all'accesso a questi dati sono gestite dal TM o dall'AP invece di utilizzare
le tecniche di sicurezza IBM i standard.
Nota: la seguente considerazione è valida solo per le transazioni con blocchi nell'ambito del lavoro.
v Se il lavoro consiste nel riprendere un ramo transazione, la connessione utilizzata dipende dal fatto che
l'associazione di ramo transazione sospesa sia stata stabilita avviando un ramo transazione o unendosi
a esso.
Il successivo lavoro viene eseguito sulla stessa connessione finché non viene utilizzata l'API
db2xa_end() per sospendere o terminare l'associazione del sottoprocesso a tale ramo transazione.
Considerazioni sulla CLI
v Se per eseguire le transazioni XA viene utilizzata la CLI, potrebbe essere stabilita più di una
connessione nello stesso sottoprocesso dopo l'utilizzo dell'API db2xa_open(). Le connessioni possono
48
IBM i: Database Controllo del commit
essere utilizzate in altri sottoprocessi per eseguire delle transazioni XA, a condizione che questi altri
sottoprocessi utilizzino prima l'API db2xa_open() con lo stesso valore di parametro xainfo.
Nota: la seguente considerazione è valida solo per le transazioni con blocchi nell'ambito del lavoro.
v Se per eseguire le transazioni XA viene utilizzata la CLI, la connessione utilizzata per avviare un ramo
transazione deve essere utilizzata per tutto il lavoro su tale ramo transazione. Se un altro sottoprocesso
consiste nell'unirsi al ramo transazione, il gestore di connessione per la connessione utilizzata per
avviare il ramo transazione deve essere trasmesso al sottoprocesso di unione in modo che possa
eseguire il lavoro sulla stessa connessione. In modo analogo, se un sottoprocesso consiste nel
riprendere il ramo transazione, deve essere utilizzata la stessa connessione.
Poiché i gestori di connessione CLI non possono essere utilizzati in un lavoro differente, la funzione di
unione è limitata ai sottoprocessi in esecuzione nello stesso lavoro che ha avviato il ramo transazione
quando viene utilizzata la CLI.
Considerazioni sul database relazionale remoto
Nota: queste considerazioni relative a un database relazionale remoto sono valide solo per le transazioni
con dei blocchi nell'ambito del lavoro.
v Le connessioni XA a un database relazionale remoto sono supportate solo se il database relazionale si
trova su un sistema che supporta le connessioni DUW (Distributed Unit of Work - unità di lavoro
distribuita) DRDA. Questo include i prodotti System i che eseguono DRDA (Distributed Relational
Database Architecture) su conversazioni SNA LU 6.2 o che utilizzano V5R1 o successive quando
eseguono DRDA utilizzando connessioni TCP/IP. Questo include anche altre piattaforme che
supportano DRDA su SNA LU 6.2 o che supportano il protocollo XA utilizzando DRDA su TCP/IP.
v Prima di utilizzare la funzione di unione XA, l'API db2xa_open() deve essere utilizzata nel
sottoprocesso di unione. È necessario specificare lo stesso nome di database relazionale e lo stesso
RMID nell'API db2xa_open() sia nel sottoprocesso che ha avviato il ramo transazione sia nel
sottoprocesso di unione. Se il ramo transazione è attivo quando viene tentata un'unione, il
sottoprocesso di unione viene bloccato. Il sottoprocesso di unione rimane bloccato finché il ramo attivo
non sospende o termina la sua associazione al ramo transazione.
Considerazioni sul ripristino
|
|
|
|
|
|
|
|
|
|
|
|
|
v Il supporto di rollback o commit euristico manuale fornito per tutte le definizioni di commit può essere
utilizzato se diventa necessario forzare un ramo transazione a eseguire il commit o il rollback mentre è
in uno stato di preparato.
v Il supporto di rollback euristico manuale è consentito anche per i rami transazione che sono in uno
stato di attivo o inattivo. Questo supporto è soprattutto importante quando si verifica un errore di
connessione client dopo che l'API xa_end è stata utilizzata per passare il ramo transazione allo stato di
inattivo ma prima dell'utilizzo di xa_commit o xa_rollback per completare la transazione. Se il gestore
transazioni del client non torna a completare il ramo transazione inattivo dopo l'errore di connessione,
il ramo transazione inattivo diventa orfano e rimarrà in sospeso finché il sistema non viene riavviato o
finché non viene eseguito un rollback euristico manuale.
v Esiste anche un'opzione manuale per ignorare i rami transazione che sono in uno stato di completato
euristicamente. Se un gestore transazioni non si attiene al protocollo XA per emettere l'API xa_forget
dopo aver ricevuto un codice di ritorno di decisione euristica, il ramo transazione diventa orfano e
rimarrà nello stato di euristicamente completato anche se viene eseguito un riavvio del sistema. Il ramo
transazione non detiene modifiche in sospeso o blocchi in questo stato ma consuma memoria di
sistema che viene liberata quando viene applicata l'opzione "ignora".
Considerazioni sui rami transazione
v Le informazioni sui rami transazione XA vengono visualizzate come parte delle informazioni sul
controllo del commit visualizzate da System i Navigator e dai comandi WRKJOB (Gestione lavoro),
DSPJOB (Visualizzazione lavoro) e WRKCMTDFN (Gestione definizioni di commit). Il nome TM, lo
stato del ramo transazione, l'identificativo della transazione e il qualificatore ramo vengono tutti
Controllo del commit
49
visualizzati. Le definizioni di commit correlate alle transazioni XA attualmente attive possono essere
visualizzate utilizzando il comando WRKCMTDFN JOB(*ALL) STATUS(*XOPEN) o visualizzando la cartella
Transazioni globali in System i Navigator.
Nota: la seguente voce è valida solo per le transazioni con blocchi nell'ambito del lavoro.
v Se un'associazione tra un sottoprocesso e un ramo transazione esistente viene sospesa o terminata
utilizzando l'API db2xa_end(), il sottoprocesso potrebbe avviare un nuovo ramo transazione. Se la
connessione utilizzata per avviare il nuovo ramo transazione è stata utilizzata precedentemente per
avviare un ramo transazione differente e l'associazione del sottoprocesso con tale ramo transazione è
stata terminata o sospesa dall'API db2xa_end(), potrebbe essere avviato un nuovo lavoro server SQL.
Un nuovo lavoro server SQL occorre solo se il primo ramo transazione non è stato ancora completato
dall'API db2xa_commit() o db2xa_rollback(). In questo caso, alla registrazione lavoro viene inviato un
altro messaggio di completamento SQL7908 che identifica il nuovo lavoro server SQL, proprio come il
lavoro server SQL originario della connessione era stato identificato quando era stata stabilita la
connessione. Tutte le richieste SQL per il nuovo ramo transazione vengono instradate al nuovo lavoro
server SQL. Quando il ramo transazione viene completato dall'API db2xa_commit() o db2xa_rollback(),
il nuovo lavoro server SQL viene riciclato (arrestato e riavviato) e restituito al lotto del lavoro di
preavvio.
v Un ramo transazione viene contrassegnato come Solo rollback nelle seguenti situazioni solo per le
transazioni XA per i blocchi nell'ambito del lavoro:
– Un sottoprocesso termina mentre è ancora associato al ramo transazione. Questo include un
sottoprocesso che termina in seguito alla terminazione di un processo.
– Si verifica un malfunzionamento del sistema.
v Con le transazioni XA per i blocchi nell'ambito della transazione, un ramo transazione viene sottoposto
a rollback dal sistema se qualche sottoprocesso è ancora associato a esso quando si verifica una delle
seguenti situazioni:
– La connessione correlata al ramo transazione viene terminata.
– Il lavoro che ha avviato il ramo transazione viene terminato.
– Si verifica un malfunzionamento del sistema.
Nota: la seguente considerazione è valida solo per le transazioni con blocchi nell'ambito del lavoro.
v Esiste una situazione in cui un ramo transazione verrà sottoposto a rollback dal sistema,
indipendentemente dal fatto che ci siano ancora dei sottoprocessi associati. Questo si verifica quando il
lavoro server SQL cui si sta instradando il lavoro della connessione viene terminato. Questo si verifica
solo quando su tale lavoro viene utilizzato il comando CL ENDJOB (Fine lavoro).
v Un ramo transazione non è interessato da questa condizione se nessun sottoprocesso ha
un'associazione attiva ad esso quando si verifica una delle seguenti situazioni. Il TM può eseguire il
commit o il rollback del ramo transazione da qualsiasi sottoprocesso che ha utilizzato l'API xa_open() o
db2xa_open() con lo stesso valore di parametro xainfo che era stato specificato nel sottoprocesso che ha
avviato il ramo transazione.
– La connessione correlata al ramo transazione viene terminata.
– Un sottoprocesso o un lavoro che ha eseguito del lavoro per il ramo transazione utilizza l'API
xa_close() o db2xa_close().
– Si verifica un malfunzionamento del sistema. In questo caso, il ramo transazione non è interessato
da questa condizione solo se è in uno stato di preparato. Se si trova nello stato di inattivo, il sistema
ne esegue il rollback.
v Quando gli identificativi transazione (XID) di due rami transazione XA hanno lo stesso identificativo
transazione globale (GTRID), ma qualificatori ramo (BQUAL) differenti, vengono indicati come
liberamente accoppiati (o loosely coupled). Per impostazione predefinita, i rami transazione liberamente
accoppiati non condividono blocchi. Tuttavia, quando si utilizzano le API XA per i blocchi nell'ambito
della transazione, esiste un'opzione che consente alle transazioni liberamente accoppiate di condividere
blocchi.
50
IBM i: Database Controllo del commit
Concetti correlati
“Considerazioni per le transazioni XA” a pagina 25
Nell'ambiente XA, ciascun database viene considerato un gestore risorsa separato. Quando un gestore
transazioni desidera accedere a due database sotto la stessa transazione, deve utilizzare i protocolli XA
per eseguire un commit in due fasi con i due gestori risorse.
The Open Group Web site
“Modalità server SQL e transazioni nell'ambito del sottoprocesso per il controllo del commit”
Le definizioni di commit con dei blocchi nell'ambito del lavoro sono di solito inclusi nell'ambito di un
gruppo di attivazione.
Attività correlate
“Quando forzare le opzioni di commit e di rollback e quando annullare la risincronizzazione” a pagina
117
La decisione di forzare un'operazione di commit o di rollback viene detta decisione euristica. Questa azione
abilita un operatore ad eseguire il commit o il rollback manualmente delle risorse per una transazione che
è in uno stato Preparato.
Modalità server SQL e transazioni nell'ambito del sottoprocesso per il
controllo del commit
Le definizioni di commit con dei blocchi nell'ambito del lavoro sono di solito inclusi nell'ambito di un
gruppo di attivazione.
Se un lavoro è a più sottoprocessi, tutti i sottoprocessi nel lavoro hanno accesso alla definizione di
commit e le modifiche apportate per una specifica transazione possono essere distribuite su più
sottoprocessi. In altri termini, tutti i sottoprocessi i cui programmi vengono eseguiti nello stesso gruppo
di attivazione partecipano a una singola transazione.
Ci sono casi in cui è desiderabile che il lavoro transazionale sia incluso nell'ambito del sottoprocesso
piuttosto che di un gruppo di attivazione. In altre parole, ogni sottoprocesso ha una propria definizione
di commit e un proprio lavoro transazionale poiché ciascuna definizione di commit è indipendente dal
lavoro eseguito in altri sottoprocessi.
DB2 for i fornisce questo supporto utilizzando l'API QWTCHGJB (Modifica lavoro) per modificare il
lavoro da eseguire in modalità server SQL. Quando è richiesta in modalità server SQL, una connessione
SQL viene instradata a un lavoro separato. Anche tutte le successive operazioni SQL eseguite per tale
connessione vengono instradate a tale lavoro. Quando viene stabilita la connessione, il messaggio di
completamento SQL7908 viene inviato alla registrazione lavoro del lavoro in modalità server SQL con
l'indicazione del lavoro cui si stanno instradando le richieste SQL. La definizione di commit appartiene al
lavoro indicato in questo messaggio. Se si verificano degli errori, potrebbe essere necessario consultare le
registrazioni lavoro per entrambi i lavori per comprendere l'origine del problema perché nessuna
operazione effettiva viene eseguita nel lavoro che esegue le istruzioni SQL.
In fase di esecuzione in modalità server SQL, solo le interfacce SQL possono essere utilizzate per eseguire
delle operazioni sotto il controllo del commit. È possibile utilizzare l'SQL incorporato o CLI (Call Level
Interface). Tutte le connessioni stabilite tramite l'SQL incorporato in un singolo sottoprocesso sono
instradate allo stesso lavoro di back-end. Questo consente a una singola richiesta di commit di eseguire il
commit del lavoro per tutte le connessioni, proprio come può essere in un lavoro che non è in esecuzione
in modalità server SQL. Ciascuna connessione stabilita tramite la CLI viene instradata a un lavoro
separato. La CLI richiede che il lavoro eseguito per ciascuna connessione venga sottoposto a commit o a
rollback indipendentemente.
Non è possibile effettuare le seguenti operazioni sotto il controllo del commit quando si è in esecuzione
in modalità server SQL:
v Modifiche di record eseguite con delle interfacce che non siano interfacce SQL
Controllo del commit
51
v Modifiche ai file DDM
v Modifiche alle risorse di commit API
Non è possibile avviare il controllo del commit direttamente in un lavoro in esecuzione in modalità
server SQL.
Concetti correlati
“Supporto delle transazioni XA per il controllo del commit” a pagina 46
DB2 for i può partecipare nelle transazioni globali X/Open.
Running DB2 CLI in server mode
Starting DB2 CLI in SQL server mode
Restrictions for running DB2 CLI in server mode
Riferimenti correlati
Change Job (QWTCHGJB) API
Avvio del controllo del commit
Per avviare il controllo del commit, utilizzare il comando STRCMTCTL (Avvio controllo commit).
Nota: il controllo del commit non deve necessariamente essere avviato dalle applicazioni SQL. SQL avvia
in modo implicito il controllo del commit in fase di connessione quando il livello di isolamento
SQL è diverso da *NONE.
Quando si utilizza il comando STRCMTCTL, è possibile specificare questi parametri.
Livello di blocco del commit
Specificare il livello di blocco con il parametro LCKLVL nel comando STRCMTCTL. Il livello
specificato diventa il livello predefinito di blocco di record per i file di database aperti e posti
sotto il controllo del commit per la definizione di commit.
Oggetto di notifica del commit
Utilizzare il parametro NTFY per specificare l'oggetto di notifica. Un oggetto di notifica è una
coda messaggi, un'area dati o un file di database che contiene le informazioni che identificano
l'ultima transazione eseguita correttamente completata per una specifica definizione di commit se
tale definizione di commit non è stata terminata normalmente.
Parametro di ambito del commit
Utilizzare il parametro CMTSCOPE per specificare l'ambito del commit. Quando viene avviato il
controllo del commit, il sistema crea una definizione di commit. Il parametro di ambito del
commit identifica l'ambito per la definizione di commit. Il valore predefinito consiste
nell'includere la definizione di commit nell'ambito del gruppo di attivazione del programma che
esegue la richiesta di avvio del controllo del commit. L'ambito alternativo è quello del lavoro.
Parametro di giornale predefinito
È possibile specificare un giornale predefinito quando si avvia il controllo del commit. È possibile
utilizzare un giornale predefinito per questi motivi:
v Si desidera catturare le voci di giornale della transazione. Queste voci possono essere di ausilio
nell'analisi della cronologia di quali risorse sono associate a una transazione. Non sono
utilizzate per applicare e rimuovere modifiche registrate su giornale. Il parametro delle voci
giornale da omettere (OMTJRNE) determina se il sistema scrive le voci di transazione.
v Si desidera migliorare le prestazioni per i lavori che chiudono file e li aprono nuovamente in
un passo di instradamento. Se si chiudono tutti i file assegnati a un giornale che non è quello
predefinito, tutte le informazioni di sistema sul giornale vengono eliminate dal passo di
instradamento. Se un file assegnato a tale giornale viene aperto successivamente, tutte le
52
IBM i: Database Controllo del commit
informazioni sul giornale devono essere create nuovamente. Il sistema conserva le informazioni
sul giornale predefinito con la definizione di commit, se qualche risorsa assegnata al giornale è
attiva.
Parametro di testo del commit
Utilizzare il parametro TEXT per identificare il testo specifico da associare a una definizione di
commit quando si visualizzano le informazioni sulle definizioni di commit avviate per un lavoro.
Se non viene specificato del testo, il sistema fornisce una descrizione di testo predefinita.
Parametro di omissione di voci del giornale
Se si specifica un giornale predefinito per migliorare le prestazioni, è possibile utilizzare il
parametro OMTJRNE per impedire al sistema di scrivere delle voci di giornale della transazione.
Quando il sistema scrive delle voci di transazione, la dimensione del ricevitore di giornale
aumenta notevolmente, con una conseguente riduzione delle prestazioni durante le operazioni di
commit e rollback.
Le voci di transazione possono essere utili durante la configurazione e la verifica dell'ambiente di
controllo del commit o di una nuova applicazione.
Le voci di transazione vengono scritte nel giornale predefinito indipendentemente dal valore del
parametro OMTJRNE quando si verificano le seguenti condizioni:
v Si verifica un errore di sistema durante un'operazione di commit o rollback.
v Viene apportata una modifica manuale a una risorsa che partecipava a una transazione e la
modifica ha causato una condizione euristica mista. Consultare la sezione Stati della
transazione per il controllo del commit in due fasi per una descrizione della condizione
euristica mista. Questo tipo di modifica manuale è detto decisione euristica.
È possibile utilizzare le informazioni che indicano quali risorse partecipavano alla transazione per
determinare quale azione eseguire in queste situazioni.
È possibile utilizzare il programma di ricerca delle informazioni sulle voci del giornale per
visualizzare i layout dei dati specifici per le voci di giornale della transazione (controllo del
commit).
Concetti correlati
“Stati della transazione per il controllo del commit a due fasi” a pagina 31
Una definizione di commit viene stabilita su ciascuna ubicazione che fa parte della rete del programma di
transazione. Per ciascuna definizione di commit, il sistema tiene traccia dello stato della sua transazione
corrente e della transazione precedente.
Journal entry information finder
Attività correlate
“Quando forzare le opzioni di commit e di rollback e quando annullare la risincronizzazione” a pagina
117
La decisione di forzare un'operazione di commit o di rollback viene detta decisione euristica. Questa azione
abilita un operatore ad eseguire il commit o il rollback manualmente delle risorse per una transazione che
è in uno stato Preparato.
Riferimenti correlati
Start Commitment Control (STRCMTCTL) command
Oggetto di notifica del commit
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
Le informazioni utilizzate per identificare l'ultima transazione eseguita correttamente per una definizione
di commit vengono fornite dall'identificazione di commit che associa un'operazione di commit a una
specifica serie di modifiche di risorse di cui è possibile eseguire il commit.
Controllo del commit
53
L'identificazione di commit dell'ultima transazione eseguita correttamente per una definizione di commit
viene inserita nell'oggetto di notifica solo se la definizione di commit non termina normalmente. Le
informazioni possono essere utilizzate per aiutare a determinare dove è terminata l'elaborazione di
un'applicazione, in modo che l'applicazione può essere avviata nuovamente.
Per i lotti dischi indipendenti, l'oggetto di notifica deve trovarsi sullo stesso lotto dischi indipendente o
gruppo di lotti dischi indipendenti della definizione di commit. Se si sposta la definizione di commit in
un altro lotto dischi indipendente o gruppo di lotti dischi indipendenti, anche l'oggetto di notifica deve
trovarsi sull'altro lotto dischi indipendente o gruppo di lotti dischi indipendenti. L'oggetto di notifica
sull'altro lotto dischi indipendente o gruppo di lotti dischi indipendenti viene aggiornato se si verifica
una fine anomala della definizione di commit. Se l'oggetto di notifica non viene trovato sull'altro lotto
dischi indipendente o gruppo di lotti dischi indipendenti, l'aggiornamento ha esito negativo con il
messaggio CPF8358.
Se le risorse registrate su giornale partecipano alla transazione corrente e viene eseguita un'operazione di
commit con un'identificazione di commit, l'identificazione di commit viene inserita nella voce di giornale
di commit (codice giornale e tipo di voce C CM) che identifica quella specifica transazione come in fase
di commit. Una voce di giornale di commit che contiene l'identificazione di commit viene inviata a
ciascun giornale associato alle risorse che partecipavano alla transazione.
La seguente tabella mostra come specificare l'identificazione di commit e la sua dimensione massima. Se
supera la sua dimensione massima, l'identificazione di commit viene troncata quando viene scritta
nell'oggetto di notifica.
Linguaggio
Operazione
Numero massimo di caratteri
nell'identificazione di commit
CL
Comando COMMIT
3000
1
ILE (Integrated Language
Environment) RPG
Codice operazione COMIT
4000
1
PLI
Sottoroutine PLICOMMIT
4000
1
ILE C
Funzione _Rcommit
4000
1
ILE COBOL
Verbo COMMIT
Non supportato
SQL
Istruzione COMMIT
Non supportato
1
Nota: Se l'oggetto di notifica è un'area dati, la dimensione massima è 2000 caratteri.
Quando un oggetto di notifica viene aggiornato con l'identificazione di commit, viene aggiornato nel
seguente modo:
File di database
Se un file di database viene utilizzato come l'oggetto di notifica, l'identificazione di commit viene
aggiunta alla fine del file. Eventuali record esistenti verranno lasciati nel file. Poiché è possibile
che più utenti o lavori modifichino i record contemporaneamente, ciascuna identificazione di
commit nel file contiene delle informazioni univoche per associare i dati al lavoro e alla
definizione di commit per cui si è verificato l'esito negativo. Il file che funge da oggetto di
notifica può essere registrato su giornale
Area dati
Se un'area dati viene utilizzata come oggetto di notifica, l'intero contenuto dell'area dati viene
sostituito quando l'identificazione di commit viene inserita nell'area dati. Se più di un utente o un
lavoro sta utilizzando lo stesso programma, solo l'identificazione di commit dall'ultima
definizione di commit che non è terminata normalmente si troverà nell'area dati. Di conseguenza,
un singolo oggetto di notifica di area dati potrebbe non produrre le informazioni corrette per
riavviare i programmi applicativi. Per risolvere questo problema, utilizzare un'area dati separata
per ciascuna definizione di commit per ciascun lavoro o utente della stazione di lavoro.
54
IBM i: Database Controllo del commit
Coda messaggi
Se una coda messaggi viene utilizzata come oggetto di notifica, il messaggio CPI8399 viene
inviato alla coda messaggi. L'identificazione di commit viene inserita nel testo di secondo livello
per il messaggio CPI8399. Come succede con l'utilizzo di un file di database per l'oggetto di
notifica, il contenuto di ciascuna identificazione di commit identifica in modo univoco una
specifica definizione di commit per un lavoro in modo che un programma applicativo possa
essere riavviato.
Concetti correlati
“Controllo del commit per le applicazioni batch” a pagina 27
Le applicazioni batch possono richiedere o meno il controllo del commit. In alcuni casi, un'applicazione
batch può eseguire una singola funzione di lettura di un file di immissione e di aggiornamento di un file
master. Tuttavia, è possibile utilizzare il controllo del commit per questo tipo di applicazione se è
importante avviarla nuovamente dopo una fine anomala.
“Esempio: utilizzo di un oggetto di notifica per avviare un'applicazione” a pagina 94
Quando viene avviato dopo una fine anomala, un programma può cercare una voce nell'oggetto di
notifica. Se la voce esiste, il programma può riavviare una transazione. Dopo che la transazione è stata
avviata nuovamente, l'oggetto di notifica viene cancellato dal programma per evitare che avvii la stessa
transazione un'ennesima volta.
Livello di blocco del commit
Il valore specificato per il parametro LCKLVL nel comando STRCMTCTL (Avvio controllo commit)
diventa il livello predefinito di blocco di record per i file di database aperti e posti sotto il controllo del
commit per la definizione di commit.
Il livello predefinito di blocco di record non può essere sovrascritto quando si aprono i file di database
locali. Tuttavia, i file di database cui accede tramite SQL utilizzano il livello di isolamento SQL corrente
effettivo quando viene emessa la prima istruzione SQL su di essi.
Il livello di blocco deve essere specificato in base alle proprie esigenze, ai periodi di attesa consentiti e
alle procedure di rilascio utilizzate con maggiore frequenza.
Le seguenti descrizioni si applicano solo ai file aperti sotto il controllo del commit:
Livello di blocco *CHG
Utilizzare questo valore se si desidera proteggere i record modificati da modifiche apportate da
altri lavori in esecuzione contemporaneamente. Per i file aperti sotto il controllo del commit, il
blocco è mantenuto per la durata della transazione. Per i file non aperti sotto il controllo del
commit, il blocco sul record viene detenuto solo da quando il record viene letto a quando viene
completata l'operazione di aggiornamento.
Livello di blocco *CS
Utilizzare questo valore per proteggere sia i record modificati sia quelli richiamati da modifiche
apportate da altri lavori in esecuzione contemporaneamente. I record richiamati non modificati
sono protetti solo fino a quando vengono rilasciati o a quando viene richiamato un record
differente.
Il livello di blocco *CS assicura che altri lavori non possano leggere per l'aggiornamento un
record che è stato letto da questo lavoro. Inoltre, il programma non può leggere i record per
l'aggiornamento che sono stati bloccati con un tipo di blocco di record di *UPDATE in un altro
lavoro finché il lavoro non accede a un record differente.
Livello di blocco *ALL
Utilizzare questo valore per proteggere i record modificati e i record richiamati che sono sotto il
controllo del commit dalle modifiche apportate da altri lavori in esecuzione sotto il controllo del
commit contemporaneamente. I record richiamati o modificati sono protetti fino alla successiva
operazione di commit o rollback.
Controllo del commit
55
Il livello di blocco *ALL assicura che altri lavori non possano accedere per l'aggiornamento a un
record che è stato letto da questo lavoro. Questo è diverso dal normale protocollo di blocco.
Quando il livello di blocco è specificato come *ALL, non è possibile accedere neppure a record
che non è letto per l'aggiornamento, se è bloccato con un tipo di blocco di record di *UPDATE in
un altro lavoro.
La seguente tabella mostra la durata dei blocchi di record per i file sotto il controllo del commit, o meno.
Richiesta
Parametro LCKLVL
Durata del blocco
Tipo di blocco
Sola lettura
Nessun controllo del
commit
Nessun blocco
Nessuno
*CHG
Nessun blocco
Nessuno
*CS
Da lettura a rollback,
commit o lettura successivi
*READ
*ALL
Da lettura a commit o
rollback
*READ
Nessun controllo del
commit
Da lettura ad
aggiornamento o
cancellazione
*UPDATE
*CHG
Da lettura ad
aggiornamento o
cancellazione
*UPDATE
Lettura per aggiornamento
quindi aggiornamento o
cancellazione1
Quindi da aggiornamento o *UPDATE
cancellazione a rollback o
commit successivi2
*CS
Da lettura ad
aggiornamento o
cancellazione
*UPDATE
Quindi da aggiornamento o *UPDATE
cancellazione a rollback o
commit successivi2
*ALL
Da lettura ad
aggiornamento o
cancellazione
*UPDATE
Quindi da aggiornamento o
cancellazione a rollback o
commit successivi2
Lettura per aggiornamento
quindi rilascio1
Nessun controllo del
commit
Da lettura a rilascio
*UPDATE
*CHG
Da lettura a rilascio
*UPDATE
*CS
Da lettura a rilascio,
commit o rollback
*UPDATE
Quindi da rilascio a
rollback, commit o lettura
successivi
*UPDATE
Da lettura a rilascio,
commit o rollback
*UPDATE
*ALL
Quindi da rilascio a
rollback o commit
successivi
56
IBM i: Database Controllo del commit
Richiesta
Parametro LCKLVL
Durata del blocco
Tipo di blocco
Aggiunta
Nessun controllo del
commit
Nessun blocco
Nessuno
*CHG
Da aggiunta a commit o
rollback
*UPDATE
*CS
Da aggiunta a commit o
rollback
*UPDATE
*ALL
Da aggiunta a commit o
rollback
*UPDATE
Nessun controllo del
commit
Per la durata della scrittura *UPDATE
diretta
*CHG
Da scrittura diretta a
commit o rollback
*UPDATE
*CS
Da scrittura diretta a
commit o rollback
*UPDATE
*ALL
Da scrittura diretta a
commit o rollback
*UPDATE
Scrittura diretta
Note:
1
Se un'operazione di commit o di rollback viene eseguita dopo un'operazione di lettura per l'aggiornamento ma
prima che il record venga aggiornato, cancellato o rilasciato, il record viene sbloccato durante l'operazione di
commit o di rollback. La protezione sul record non è più disponibile appena viene completato il commit o il
rollback.
2
Se un record viene cancellato ma il commit o il rollback non è stato ancora emesso per la transazione, il record
cancellato non rimane bloccato. Se lo stesso lavoro, o uno differente, prova a leggere il record cancellato in base alla
chiave, tale lavoro riceve un'indicazione di record non trovato. Tuttavia, se esiste un percorso di accesso a chiave
univoca sul file, a un altro lavoro non è consentito inserire o aggiornare un record con lo stesso valore di chiave
univoca del record cancellato finché non sarà stato eseguito il commit della transazione.
Un tipo di blocco di record di *READ viene ottenuto sui record che non sono letti per l'aggiornamento
quando il livello di blocco è *CS o *ALL. Questo tipo di blocco impedisce ad altri lavori di leggere i
record per l'aggiornamento ma non impedisce l'accesso ai record da parte di un'operazione di sola lettura.
Un tipo di blocco di record di *UPDATE viene ottenuto sui record che vengono aggiornati, cancellati,
aggiunti o letti per l'aggiornamento. Questo tipo di blocco impedisce ad altri lavori di leggere i record per
l'aggiornamento e impedisce ai lavori in esecuzione sotto il controllo del commit con un livello di blocco
di record di *CS o *ALL di accedere ai record anche per un'operazione di sola lettura.
I programmi che non stanno utilizzando il controllo del commit possono leggere i record bloccati da un
altro lavoro ma non possono leggere i record per l'aggiornamento, indipendentemente dal valore
specificato per il parametro LCKLVL.
Il livello di blocco, specificato per una definizione di commit quando viene avviato il controllo del
commit per un gruppo di attivazione o per il lavoro, si applica solo alle aperture associate a tale specifica
definizione di commit.
Nota: i valori di livello di blocco *CS e *ALL proteggono dal richiamo di un record che ha attualmente
una modifica in sospeso da un lavoro differente. Tuttavia, i valori di livello di blocco *CS e *ALL
non proteggono dal richiamo di un record utilizzando un programma in esecuzione in un gruppo
di attivazione che attualmente ha una modifica in sospeso da un programma in esecuzione in un
gruppo di attivazione differente nello stesso lavoro.
Controllo del commit
57
Nello stesso lavoro, un programma può modificare un record che è già stato modificato nella transazione
corrente a condizione che al record si acceda nuovamente utilizzando la stessa definizione di commit.
Quando si utilizza la definizione di commit a livello di lavoro, l'accesso al record modificato può essere
eseguito da un programma in esecuzione in un gruppo di attivazione che sta utilizzando la definizione di
commit a livello di lavoro.
Concetti correlati
“Considerazioni e limitazioni per il controllo del commit” a pagina 25
È necessario tenere presente le seguenti considerazioni e limitazioni per il controllo del commit.
Riferimenti correlati
Start Commitment Control (STRCMTCTL) command
Terminazione del controllo del commit
Il comando ENDCMTCTL (Fine controllo commit) termina il controllo del commit per la definizione di
commit a livello di gruppo di attivazione o a livello di lavoro.
L'immissione del comando ENDCMTCTL indica al sistema che la definizione di commit utilizzata dal
programma che esegue la richiesta deve essere terminata. Il comando ENDCMTCTL termina una sola
definizione di commit per il lavoro e tutte le altre definizioni di commit per il lavoro rimangono
invariate.
Se la definizione di commit a livello di gruppo di attivazione viene terminata, i programmi in esecuzione
nel gruppo di attivazione non possono più apportare modifiche sotto il controllo del commit, a meno che
la definizione di commit a livello di lavoro non sia già avviata per il lavoro. Se la definizione di commit a
livello di lavoro è attiva, viene immediatamente resa disponibile per l'utilizzo da parte dei programmi in
esecuzione nel gruppo di attivazione che hanno appena terminato il controllo del commit.
Se la definizione di commit a livello di lavoro viene terminata, gli eventuali programmi in esecuzione nel
lavoro che stavano utilizzando la definizione di commit a livello di lavoro non possono più apportare
modifiche sotto il controllo del commit senza prima riavviare il controllo del commit con il comando
STRCMTCTL.
Prima di immettere il comando ENDCMTCTL, è necessario soddisfare le seguenti condizioni per la
definizione di commit da terminare:
v Devono prima essere chiusi tutti i file aperti sotto il controllo del commit per la definizione di commit
da terminare. Quando si termina la definizione di commit a livello di lavoro, l'operazione include tutti
i file aperti sotto il controllo del commit da qualsiasi programma in esecuzione in qualsiasi gruppo di
attivazione che sta utilizzando la definizione di commit a livello di lavoro.
v Devono prima essere rimosse tutte le risorse di commit API per la definizione di commit da terminare
utilizzando l'API QTNRMVCR. Quando si termina la definizione di commit a livello di lavoro, questa
operazione include tutte le risorse di commit API aggiunte da qualsiasi programma in esecuzione in
qualsiasi gruppo di attivazione che sta utilizzando la definizione di commit a livello di lavoro.
v Un database remoto associato alla definizione di commit da terminare deve essere disconnesso.
v Tutte le conversazioni protette associate alla definizione di commit devono essere terminate
normalmente utilizzando il corretto livello di sincronizzazione.
Se si sta terminando il controllo del commit in un lavoro interattivo e una o più risorse di cui è possibile
eseguire il commit associate alla definizione di commit hanno delle modifiche in sospeso, il messaggio di
interrogazione CPA8350 viene inviato all'utente richiedendo se eseguire il commit delle modifiche in
sospeso, il rollback delle modifiche in sospeso o l'annullamento della richiesta ENDCMTCTL.
Se si sta terminando il controllo del commit in un lavoro batch, e uno o più file chiusi associati alla
definizione di commit da terminare hanno ancora delle modifiche in sospeso, viene eseguito il rollback
delle modifiche e viene inviato un messaggio:
58
IBM i: Database Controllo del commit
v CPF8356 se sono registrate solo le risorse locali
v CPF835C se sono registrate solo le risorse remote
v CPF83E4 se sono registrate sia le risorse locali sia quelle remote
Se per la definizione di commit in fase di terminazione è definito un oggetto di notifica, ne potrebbe
essere eseguito l'aggiornamento.
Quando un gruppo di attivazione che ha un'API registrata come ultimo agent sta terminando, il
programma di uscita per l'API viene richiamato per ricevere la decisione di commit o di rollback. In
questo caso, anche se il gruppo di attivazione sta terminando normalmente, è comunque possibile che
una richiesta di rollback venga restituita dal programma di uscita API. È pertanto possibile che
l'operazione di commit implicito non venga eseguita.
Dopo che la definizione di commit è terminata normalmente, è stato eseguito tutto l'eventuale ripristino
necessario. Non viene eseguito alcun ripristino aggiuntivo per le risorse di commit associate alla
definizione di commit appena terminata.
Dopo che la definizione di commit è terminata, la definizione di commit a livello di gruppo di attivazione
o a livello di lavoro può essere quindi riavviata per i programmi in esecuzione nel gruppo di attivazione.
La definizione di commit a livello di lavoro può essere avviata solo se non è stata già avviata per il
lavoro.
Anche se le definizioni di commit possono essere avviate e terminate molte volte dai programmi in
esecuzione in un gruppo di attivazione, la quantità di risorse di sistema richiesta per le ripetute
operazioni di avvio e terminazione può causare una riduzione delle prestazioni del lavoro e delle
prestazioni generali del sistema. Si consiglia pertanto di lasciare attiva una definizione di commit se un
programma da richiamare successivamente ne farà uso.
Concetti correlati
“Aggiornamenti all'oggetto di notifica” a pagina 65
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di commit
eseguita correttamente per tale definizione di commit.
Riferimenti correlati
End Commitment Control (ENDCMTCTL) command
Terminazione avviata dal sistema del controllo del commit
Il sistema può terminare il controllo del commit oppure eseguire un'operazione di rollback o commit
implicito. A volte, la terminazione avviata dal sistema del controllo del commit è normale. Altre volte, il
controllo del commit termina con una fine lavoro o sistema anomala.
Controllo del commit durante la fine del gruppo di attivazione
Il sistema termina automaticamente una definizione di commit a livello di gruppo di attivazione quando
termina un gruppo di attivazione.
Se esistono delle modifiche in sospeso per una definizione di commit a livello di gruppo di attivazione e
il gruppo di attivazione sta terminando in modo normale, il sistema esegue un'operazione di commit
implicito per la definizione di commit prima che venga terminata. Altrimenti, un'operazione di rollback
implicito viene eseguita per la definizione di commit a livello di gruppo di attivazione prima che venga
terminata se il gruppo di attivazione sta terminando in modo anomalo o se il sistema ha rilevato degli
errori durante la chiusura di file aperti sotto il controllo del commit che erano nell'ambito del gruppo di
attivazione.
Nota: un'operazione di rollback o di commit implicito non viene mai eseguita durante l'elaborazione
della fine del gruppo di attivazione per le definizioni di commit *JOB o *DFTACTGRP. Questo è
Controllo del commit
59
dovuto al fatto che le definizioni di commit *JOB e *DFTACTGRP non vengono mai terminate
perché viene terminato un gruppo di attivazione. Queste definizioni di commit vengono invece
terminate in modo esplicito con un comando ENDCMTCTL oppure terminate dal sistema quando
termina il lavoro.
Il sistema chiude automaticamente i file che erano nell'ambito del gruppo di attivazione quando termina
il gruppo di attivazione. Questo include i file di database che erano nell'ambito del gruppo di attivazione
aperto sotto il controllo del commit. La chiusura per questo tipo di file si verifica prima dell'esecuzione di
eventuali operazioni di commit implicito per la definizione di commit a livello di gruppo di attivazione.
Pertanto, i record che non si trovano in un buffer I/E vengono forzati nel database prima che vengano
eseguite eventuali operazioni di commit implicito.
Come parte dell'operazione di rollback o commit implicito che potrebbe essere eseguita, viene fatta una
chiamata al programma di uscita di rollback o di commit API per ciascuna risorsa di commit API
associata alla definizione di commit a livello di gruppo di attivazione. Il programma di uscita deve
completare la sua elaborazione entro 5 minuti. Dopo il richiamo del programma di uscita di rollback o di
commit API, il sistema elimina automaticamente la risorsa di commit API.
Se un'operazione di rollback implicito viene eseguita per una definizione di commit che è in fase di
terminazione perché è in fase di terminazione un gruppo di attivazione, l'oggetto di notifica, se ne è
definito uno per la definizione di commit, potrebbe essere aggiornato.
Concetti correlati
“Aggiornamenti all'oggetto di notifica” a pagina 65
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di commit
eseguita correttamente per tale definizione di commit.
Operazioni di commit e di rollback impliciti
In alcune istanze, un'operazione di commit o di rollback viene avviata dal sistema per una definizione di
commit. Questi tipi di operazioni di commit e di rollback sono noti come richieste di commit e rollback
implicite.
Di norma, un'operazione di commit o di rollback viene avviata da un programma applicativo utilizzando
uno dei linguaggi di programmazione disponibili che supporta il controllo del commit. Questi tipi di
operazioni di commit e di rollback sono noti come richieste di commit e rollback esplicite.
Le seguenti due tabelle mostrano cosa fa il sistema quando si verificano determinati eventi correlati a una
definizione di commit che ha delle modifiche in sospeso. Una definizione di commit ha delle modifiche
in sospeso se si verifica una delle seguenti condizioni:
v Una risorsa di cui è possibile eseguire il commit è stata aggiornata.
v Un file di database aperto sotto il controllo del commit è stato letto perché la lettura di un file ne
modifica la posizione.
v La definizione di commit ha una risorsa API. Poiché le modifiche alle risorse API vengono eseguite da
un programma utente, il sistema deve presumere che tutte le risorse API abbiano delle modifiche in
sospeso.
Le voci di giornale C CM (operazione di commit) e C RB (operazione di rollback) indicano se
l'operazione era esplicita o implicita.
La seguente tabella mostra le azioni eseguite dal sistema quando un lavoro termina, in modo normale o
anomalo, sulla base delle seguenti situazioni:
v Lo stato della transazione.
v Il valore di azione in caso di fine lavoro per la definizione di commit.
v Se una risorsa API è l'ultimo agent.
60
IBM i: Database Controllo del commit
Stato
API ultimo agent
opzione Azione in
caso di fine lavoro1
RST
N/A
N/A
Operazione di commit o di rollback
Se la definizione di commit non è associata
a una transazione globale X/Open, viene
eseguito un rollback implicito.
Se la definizione di commit è associata a
una transazione globale X/Open, si
verificano i seguenti eventi:
v Se lo stato del ramo transazione non è
Attivo (S1), non viene eseguita alcuna
azione e il ramo transazione viene lasciato
nello stesso stato.
v Se lo stato del ramo transazione è Attivo
(S1), viene eseguito un rollback implicito.
PIP
N/A
N/A
Se la definizione di commit non è associata
a una transazione globale X/Open, viene
eseguito un rollback implicito.
Se la definizione di commit è associata a
una transazione globale X/Open, il ramo
transazione si trova nello stato Inattivo (S2)
e viene lasciato nello stato Inattivo (S2).
PRP
N/A
WAIT
Se la definizione di commit non è associata
a una transazione globale X/Open2, si
verifica quanto segue:
v La risincronizzazione viene avviata per
ricevere la decisione dall'iniziatore
dell'operazione di commit.
v Viene eseguita la decisione restituita di
eseguire il commit o il rollback. Viene
considerata un'operazione esplicita.
PRP
N/A
C
Se la definizione di commit non è associata
a una transazione globale X/Open2, viene
eseguita un'operazione di commit implicito.
R
Se la definizione di commit non è associata
a una transazione globale X/Open, viene
eseguita un'operazione di rollback implicito.
Se la definizione di commit è associata a
una transazione globale X/Open, si verifica
quanto segue:
v Se il lavoro che ha avviato la transazione
viene terminato, la transazione viene
lasciata in uno stato preparato finché l'XA
TM non ne esegue il commit o il rollback.
Lo stato del ramo transazione XA sarà
lasciato come Preparato (S3), in questo
caso.
v Se il lavoro del server SQL cui si sta
instradando il lavoro della transazione
viene terminato, viene eseguito in modo
implicito un rollback forzato. Lo stato del
ramo transazione XA verrà modificato in
Completato euristicamente (S5), in questo
caso.
Controllo del commit
61
Stato
API ultimo agent
opzione Azione in
caso di fine lavoro1
CIP
N/A
N/A
Viene eseguita un'operazione di commit
esplicito.
LAP
NO
WAIT
1. La risincronizzazione all'ultimo agent
viene utilizzata per richiamare la decisione
di eseguire il commit o il rollback.
Operazione di commit o di rollback
2. Viene eseguita la decisione restituita di
eseguire il commit o il rollback. Viene
considerata un'operazione esplicita.
LAP
SÌ
WAIT
1. L'API dell'ultimo agent viene richiamata
per richiamare la decisione di commit o di
rollback.
2. Viene eseguita l'operazione di commit o
di rollback. Viene considerata un'operazione
esplicita.
LAP
N/A
C
Viene eseguita un'operazione di commit
implicito.
R
Viene eseguita un'operazione di rollback
implicito.
CMT
N/A
N/A
Un'operazione di commit è già stata
completata per questa definizione di commit
ed eventuali ubicazioni successive.
L'operazione di commit è completa.
VRO
N/A
N/A
Gli agent locali e remoti hanno fornito
l'indicazione per la sola lettura. Anche tutti
gli agent successivi devono avere fornito
l'indicazione per la sola lettura. Nessuna
azione richiesta.
RBR
N/A
N/A
È richiesta un'operazione di rollback. Viene
eseguita un'operazione di rollback esplicito.
Nota:
1
È possibile modificare l'opzione Azione in caso di fine lavoro con l'API QTNCHGCO (Modifica opzioni di
commit).
2
Se la definizione di commit è associata a una transazione globale X/Open, si verificano i seguenti eventi:
v Se il lavoro che ha avviato la transazione viene terminato, la transazione viene lasciata in uno stato preparato
finché l'XA TM non ne esegue il commit o il rollback. Lo stato del ramo transazione XA sarà lasciato come
Preparato (S3), in questo caso.
v Solo per i blocchi nell'ambito della transazione, se il lavoro del server SQL cui si sta instradando il lavoro della
transazione viene terminato, viene eseguito in modo implicito un rollback forzato. Lo stato del ramo transazione
XA verrà modificato in Completato euristicamente (S5), in questo caso.
La seguente tabella mostra le azioni eseguite dal sistema quando un gruppo di attivazione termina e si
applica solo alle transazioni con dei blocchi nell'ambito del lavoro. Le azioni di sistema sono basate sui
seguenti elementi:
v Lo stato della transazione. (È sempre reimpostato (RST) quando termina un gruppo di attivazione).
v Il modo in cui termina il gruppo di attivazione: normalmente o in modo anomalo.
v Se una risorsa API è l'ultimo agent.
62
IBM i: Database Controllo del commit
Nota: se una risorsa API è registrata come ultimo agent, questo dà il controllo della decisione di
esecuzione del commit o del rollback all'ultimo agent. Il risultato della decisione è considerato
un'operazione esplicita
Stato
API ultimo agent
Tipo di terminazione
Operazione di commit o di rollback
RST
No
Normale
Viene eseguita un'operazione di commit
implicito. Se esistono delle conversazioni
protette, la definizione di commit diventerà
l'iniziatore root dell'operazione di commit.
RST
No
Anomalo
Viene eseguito un ripristino implicito.
RST
Sì
Normale
Viene richiamato il programma di uscita
API. L'operazione di commit o di rollback
viene determinata dall'API.
RST
Sì
Anomalo
Viene richiamato il programma di uscita
API. L'operazione di commit o di rollback
viene determinata dall'API.
Concetti correlati
“Controllo del commit durante la fine anomala di lavoro o sistema” a pagina 64
Il sistema termina tutte le definizioni di commit per un lavoro quando il lavoro termina in modo
anomalo. Queste definizioni di commit vengono terminate durante l'elaborazione della fine lavoro.
Questo argomento è valido solo per le definizioni di commit con i blocchi nell'ambito del lavoro.
Riferimenti correlati
Change Commitment Options (QTNCHGCO) API
Controllo del commit durante la terminazione normale del passo di
instradamento
Il sistema termina tutte le definizioni di commit per un lavoro quando un passo di instradamento viene
terminato normalmente.
Nota: le seguenti informazioni si applicano solo alle definizioni di commit con i blocchi nell'ambito del
lavoro.
Un passo di instradamento termina normalmente con una delle seguenti situazioni:
v Una terminazione normale per un lavoro batch.
v Uno scollegamento normale per un lavoro interattivo.
v Il comando RRTJOB (Reinstradamento lavoro), TFRJOB (Trasferimento lavoro) o TFRBCHJOB
(Trasferimento lavoro batch) termina il passo di instradamento corrente e avvia un nuovo passo di
instradamento.
Qualsiasi altra terminazione di un passo di instradamento è considerata anomala e viene riconosciuta in
base a un codice di completamento diverso da zero nel messaggio di completamento del lavoro CPF1164
nella registrazione lavoro.
Prima di terminare una definizione di commit durante la terminazione del passo di instradamento, il
sistema esegue un'operazione di rollback implicito se la definizione di commit ha delle modifiche in
sospeso. Questo include il richiamo del programma di uscita di rollback o di commit API per ciascuna
risorsa di commit API associata alla definizione di commit. Il programma di uscita deve completare la
sua elaborazione entro 5 minuti. Dopo il richiamo del programma di uscita di rollback o di commit API,
il sistema elimina automaticamente la risorsa di commit API.
Se per la definizione di commit è definito un oggetto di notifica, ne potrebbe essere eseguito
l'aggiornamento.
Controllo del commit
63
Concetti correlati
“Aggiornamenti all'oggetto di notifica” a pagina 65
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di commit
eseguita correttamente per tale definizione di commit.
Controllo del commit durante la fine anomala di lavoro o sistema
Il sistema termina tutte le definizioni di commit per un lavoro quando il lavoro termina in modo
anomalo. Queste definizioni di commit vengono terminate durante l'elaborazione della fine lavoro.
Questo argomento è valido solo per le definizioni di commit con i blocchi nell'ambito del lavoro.
Se viene terminato in modo anomalo, il sistema termina tutte le definizioni di commit che erano state
avviate e che tutti i lavori attivi stavano utilizzando quando si è verificata la fine di sistema anomala.
Queste definizioni di commit vengono terminate come parte dell'elaborazione di ripristino del database
eseguita durante il successivo IPL dopo la fine anomala di sistema.
Attenzione: il ripristino per le definizioni di commit fa riferimento a una fine anomala per il sistema o
per un lavoro dovuta a un'interruzione dell'alimentazione, un malfunzionamento hardware o un errore
nel sistema operativo o nel LIC (Licensed Internal Code - Microprogramma interno su licenza). Non si
deve utilizzare il comando ENDJOBABN (Fine anomala del lavoro) per forzare una fine anomala del
lavoro. La fine anomala può determinare un commit o un rollback parziale delle modifiche in sospeso per
le transazioni attive per il lavoro che si sta terminando. Il successivo IPL potrebbe tentare il ripristino per
le eventuali transazioni parziali per il lavoro terminato con il comando ENDJOBABN.
L'esito del ripristino del controllo del commit eseguito dal sistema durante un IPL per un lavoro
terminato con il comando ENDJOBABN è incerto. Questo è dovuto al fatto che tutti i blocchi per la
risorsa di commit vengono rilasciati quando il lavoro viene terminato in modo anomalo. Le eventuali
modifiche in sospeso dovute a transazioni parziali vengono rese disponibili ad altri lavori. Queste
modifiche in sospeso possono quindi indurre atri programmi applicativi ad apportare delle erronee
modifiche aggiuntive al database. In modo analogo, qualsiasi ripristino IPL derivante che viene eseguito
successivamente può influenzare negativamente le modifiche apportate dalle applicazioni dopo che il
lavoro è stato terminato in modo anomalo. Ad esempio, una tabella SQL potrebbe essere cancellata
durante il ripristino IPL come azione di rollback per una creazione tabella in sospeso. Tuttavia, altre
applicazioni potrebbero già avere inserito diverse righe nella tabella dopo che il lavoro è stato terminato
in modo anomalo.
Il sistema esegue le seguenti operazioni per le definizioni di commit terminate durante una fine lavoro
anomala o durante il successivo IPL dopo una fine sistema anomala:
v Prima di terminare una definizione di commit, il sistema esegue un'operazione di rollback implicito se
la definizione di commit ha delle modifiche in sospeso, a meno che l'elaborazione per la definizione di
commit non sia stata interrotta durante un'operazione di commit. Se è stata terminata durante
un'operazione di commit, la transazione potrebbe essere sottoposta a rollback, risincronizzazione o
commit, a seconda del suo stato. L'elaborazione per eseguire l'operazione di rollback implicito o per
completare l'operazione di commit include il richiamo del programma di uscita di commit e rollback
API per ciascuna risorsa di commit API associata alla definizione di commit. Dopo il richiamo del
programma di uscita di rollback o di commit API, il sistema elimina automaticamente la risorsa di
commit API.
64
IBM i: Database Controllo del commit
Attenzione: terminare il lavoro mentre una transazione è in dubbio (lo stato transazione è LAP o
PRP) può causare delle incongruenze nel database (le modifiche potrebbero essere state sottoposte a
commit su uno o più sistemi e a rollback su altri sistemi).
– Se l'opzione di commit Azione in caso di fine lavoro è COMMIT, le modifiche su questo sistema
vengono sottoposte a commit se il lavoro viene terminato, indipendentemente dal fatto che le
modifiche su altri sistemi che partecipano alla transazione vengano sottoposte a commit o a rollback.
– Se l'opzione di commit Azione in caso di fine lavoro è ROLLBACK, le modifiche su questo sistema
vengono sottoposte a rollback se il lavoro viene terminato, indipendentemente dal fatto che le
modifiche su altri sistemi che partecipano alla transazione vengono sottoposti a commit o a rollback.
– Se l'opzione di commit Azione in caso di fine lavoro è WAIT, il lavoro verrà terminato solo dopo che
sarà stata completata la risincronizzazione con il sistema proprietario della decisione di commit o di
rollback. Per fare in modo che il lavoro venga terminato prima del completamento della
risincronizzazione, è necessario eseguire un'operazione di decisione euristica e annullare la
risincronizzazione.
Si sconsiglia di terminare il lavoro o il sistema in modo anomalo durante un rollback a lunga
esecuzione. Questo causa l'esecuzione di un altro rollback quando termina il lavoro (oppure durante il
successivo IPL, se viene terminato il sistema). Il successivo rollback ripeterà il lavoro eseguito dal
rollback originario e avrà un tempo di esecuzione molto più lungo.
v Se per la definizione di commit è definito un oggetto di notifica, ne potrebbe essere eseguito
l'aggiornamento.
Se il processo termina prima che il controllo del commit venga terminato e sono ancora attive delle
conversazioni protette, potrebbe essere richiesto il commit o il rollback della definizione di commit.
L'azione è basata sull'opzione Stato e sull'opzione Azione in caso di fine lavoro per la definizione di
commit.
Concetti correlati
“Operazioni di commit e di rollback impliciti” a pagina 60
In alcune istanze, un'operazione di commit o di rollback viene avviata dal sistema per una definizione di
commit. Questi tipi di operazioni di commit e di rollback sono noti come richieste di commit e rollback
implicite.
“Aggiornamenti all'oggetto di notifica”
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di commit
eseguita correttamente per tale definizione di commit.
Aggiornamenti all'oggetto di notifica
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di commit
eseguita correttamente per tale definizione di commit.
Per gli scopi dell'oggetto di notifica, queste sono considerate modifiche di cui non è stato eseguito il
commit:
v Un aggiornamento a un record eseguito sotto il controllo del commit.
v Un record cancellato sotto il controllo del commit.
v Una modifica a livello di oggetto eseguita su un oggetto DDL locale sotto il controllo del commit.
v Un'operazione di lettura eseguita per un file di database che è stato aperto sotto il controllo del
commit. Questo è dovuto al fatto che la posizione del file viene riportata all'ultimo limite di commit
quando viene eseguita un'operazione di rollback. Se si esegue un'operazione di lettura sotto il controllo
del commit, la posizione del file viene modificata e, pertanto, esisterà una modifica di cui non è stato
eseguito il commit per la definizione di commit.
v Una definizione di commit con una delle seguenti risorse aggiunte viene sempre considerata come se
presentasse delle modifiche di cui non è stato eseguito il commit:
– Una risorsa di commit API
Controllo del commit
65
– Una risorsa DRDA * (Distributed Relational Database Architecture) remota
– Una risorsa Distributed Database Management Architecture (DDM)
– Una risorsa LU 6.2
Questo è dovuto al fatto che il sistema non sa quando una vera modifica viene apportata all'oggetto o
agli oggetti associati a questi tipi di risorse. La sezione Tipi di risorse di cui è possibile eseguire il
commit contiene maggiori informazioni su come si aggiungono e gestiscono questi tipi di risorse.
Il sistema applica gli aggiornamenti all'oggetto di notifica in base ai seguenti modi in cui può terminare
una definizione di commit:
v Se un lavoro termina normalmente e non esistono modifiche di cui non è stato eseguito il commit, il
sistema non inserisce l'identificazione di commit dell'ultima operazione di commit eseguita
correttamente nell'oggetto di notifica.
v Se viene eseguita un'operazione di commit implicito per una definizione di commit a livello di gruppo
di attivazione quando viene terminato il gruppo di attivazione, il sistema non inserisce l'identificazione
di commit dell'ultima operazione di commit eseguita correttamente nell'oggetto di notifica.
v
v
v
v
Nota: le operazioni di commit implicite non vengono mai eseguite per la definizione di commit
*DFTACTGRP o *JOB
Se il sistema, il lavoro o un gruppo di attivazione termina in modo anomalo prima della prima
operazione di commit eseguita correttamente per una definizione di commit, il sistema non aggiorna
l'oggetto di notifica perché non c'è alcuna identificazione di ultimo commit. Per distinguere tra questa
condizione e un completamento di programma normale, il programma deve aggiornare l'oggetto di
notifica con una specifica voce prima di completare la prima operazione di commit eseguita
correttamente per la definizione di commit.
Se si verifica una fine lavoro anomala o una terminazione di sistema anomala dopo almeno
un'operazione di commit eseguita correttamente, il sistema inserisce l'identificazione di commit di tale
operazione di commit nell'oggetto di notifica. Se l'ultima operazione di commit eseguita correttamente
non specificava un'identificazione di commit, l'oggetto di notifica non viene aggiornato. Per una fine
lavoro anomala, questa elaborazione di oggetto di notifica viene eseguita per ciascuna definizione di
commit che era attiva per il lavoro. Per una terminazione di sistema anomala, questa elaborazione di
oggetto di notifica viene eseguita per ciascuna definizione di commit che era attiva per tutti i lavori sul
sistema.
Il sistema aggiorna l'oggetto di notifica con l'identificazione di commit dell'ultima operazione di
commit eseguita correttamente per tale definizione di commit se si verificano tutti gli eventi qui di
seguito indicati:
– Viene terminato un gruppo di attivazione non predefinito.
– Un'operazione di rollback implicito viene eseguita per la definizione di commit a livello di gruppo
di attivazione.
– Almeno un'operazione di commit eseguita correttamente è stata eseguita per tale definizione di
commit.
Se l'ultima operazione di commit eseguita correttamente non specificava un'identificazione di commit,
l'oggetto di notifica non viene aggiornato. Un'operazione di rollback implicito viene eseguita per una
definizione di commit a livello di gruppo di attivazione se il gruppo di attivazione sta terminando in
modo anomalo o se si sono verificati degli errori durante la chiusura dei file che erano stati aperti sotto
il controllo del commit e che erano nell'ambito di tale gruppo di attivazione. Per ulteriori informazioni
sull'inclusione dei file di database nell'ambito di gruppi di attivazione e sul modo in cui possono essere
terminati i gruppi di attivazione, consultare il manuale di riferimento per il linguaggio ILE che si sta
utilizzando.
Se esistono delle modifiche di cui non è stato eseguito il commit quando un lavoro termina in modo
normale ed è stata eseguita almeno un'operazione di commit correttamente, l'identificazione di commit
dell'ultima operazione di commit eseguita correttamente viene inserita nell'oggetto di notifica e viene
eseguito il rollback delle modifiche di cui non è stato eseguito il commit. Se l'ultima operazione di
commit eseguita correttamente non specificava un'identificazione di commit, l'oggetto di notifica non
66
IBM i: Database Controllo del commit
viene aggiornato. Questa elaborazione di oggetto di notifica viene eseguita per ciascuna definizione di
commit che era attiva per il lavoro quando il lavoro è stato terminato.
v Se esistono delle modifiche di cui non è stato eseguito il commit quando viene eseguito il comando
ENDCMTCTL, l'oggetto di notifica viene aggiornato solo se l'ultima operazione di commit eseguita
correttamente specificava un'identificazione di commit:
– Per un lavoro batch, viene eseguito il rollback delle modifiche di cui non è stato eseguito il commit e
l'identificazione di commit dell'ultima operazione di commit eseguita correttamente viene inserita
nell'oggetto di notifica.
– Per un lavoro interattivo, se la risposta al messaggio di interrogazione CPA8350 è l'esecuzione del
rollback delle modifiche, viene eseguito il rollback delle modifiche di cui non è stato eseguito il
commit e l'identificazione di commit dell'ultima operazione di commit eseguita correttamente viene
inserita nell'oggetto di notifica.
– Per un lavoro interattivo, se la risposta al messaggio di interrogazione CPA8350 è l'esecuzione del
commit delle modifiche, il sistema chiede un'identificazione di commit da utilizzare e viene eseguito
il commit delle modifiche. L'identificazione di commit immessa sul pannello di richiesta viene
inserita nell'oggetto di notifica.
– Per un lavoro interattivo, se la risposta al messaggio di interrogazione CPA8350 è l'annullamento
della richiesta ENDCMTCTL, le modifiche in sospeso restano e l'oggetto di notifica non viene
aggiornato.
Concetti correlati
“Terminazione del controllo del commit” a pagina 58
Il comando ENDCMTCTL (Fine controllo commit) termina il controllo del commit per la definizione di
commit a livello di gruppo di attivazione o a livello di lavoro.
“Controllo del commit durante la fine del gruppo di attivazione” a pagina 59
Il sistema termina automaticamente una definizione di commit a livello di gruppo di attivazione quando
termina un gruppo di attivazione.
“Controllo del commit durante la terminazione normale del passo di instradamento” a pagina 63
Il sistema termina tutte le definizioni di commit per un lavoro quando un passo di instradamento viene
terminato normalmente.
“Controllo del commit durante la fine anomala di lavoro o sistema” a pagina 64
Il sistema termina tutte le definizioni di commit per un lavoro quando il lavoro termina in modo
anomalo. Queste definizioni di commit vengono terminate durante l'elaborazione della fine lavoro.
Questo argomento è valido solo per le definizioni di commit con i blocchi nell'ambito del lavoro.
“Tipi di risorse di cui è possibile eseguire il commit” a pagina 12
Questa tabella elenca i tipi differenti di risorse di cui è possibile eseguire il commit, inclusi FILE, DDL
(Data Definition Language), DDM (distributed data management), LU (logical unit) 6.2, DRDA
(Distributed Relational Database Architecture, API e TCP.
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
Ripristino del controllo del commit durante l'IPL (initial program load)
dopo la fine anomala
Quando si esegue un IPL (initial program load) dopo la fine anomala del sistema, il sistema prova a
ripristinare tutte le definizioni di commit che erano attive quando il sistema è stato terminato.
In modo analogo, quando si attiva un lotto dischi indipendente, il sistema prova a ripristinare tutte le
definizioni di commit correlate a tale lotto dischi indipendente che erano attive quando è stato disattivato
o terminato in modo anomalo.
Controllo del commit
67
Il ripristino viene eseguito dai lavori del server di database avviati dal sistema durante l'IPL. I lavori del
server di database vengono avviati dal sistema per gestire le operazioni che non possono o non devono
essere eseguite da altri lavori.
I lavori del server di database sono denominati QDBSRVnn, dove nn è un numero di due cifre. Il numero
di lavori del server di database dipende dalla dimensione del sistema. In modo analogo, il nome del
lavoro del server di database per un lotto dischi indipendente o un gruppo di lotti dischi indipendenti è
QDBSxxxVnn, dove xxx è il numero di lotto dischi indipendente e nn è un numero di due cifre. Ad
esempio, QDBS035V02 può essere il nome del lavoro del server di database per il lotto dischi
indipendente 35.
La sezione Stati della transazione per il controllo del commit in due fasi mostra le azioni eseguite dal
sistema, a seconda dello stato della transazione quando si è verificato il malfunzionamento. Per due stati,
PRP e LAP, l'azione di sistema è in dubbio.
Note:
v Le seguenti informazioni si applicano solo alle definizioni di commit con i blocchi nell'ambito
del lavoro.
v Il gestore transazioni ripristina le definizioni di commit associate alle transazioni XA (sia se i
loro blocchi sono nell'ambito del lavoro sia se sono nell'ambito della transazione) utilizzando le
API XA, non il processo di risincronizzazione descritto in questo argomento.
Il sistema non può determinare cosa fare finché non esegue la risincronizzazione con le altre ubicazioni
che partecipano alla transazione. Questa risincronizzazione viene eseguita dopo il completamento dell'IPL
o dell'operazione di attivazione.
Il sistema utilizza i lavori del server di database per eseguire questa risincronizzazione. Le definizioni di
commit che devono essere ripristinate sono associate ai lavori del server di database. Durante l'IPL, il
sistema acquisisce tutti i blocchi di record e gli altri blocchi di oggetti che erano detenuti dalla definizione
di commit prima della terminazione del sistema. Questi blocchi sono necessari per proteggere le risorse di
commit locali finché la risincronizzazione non è completa ed è possibile eseguire il commit o il rollback
delle risorse.
I messaggi vengono inviati alle registrazioni lavoro dei lavori del server di database per indicare lo stato
della risincronizzazione con le ubicazioni remote. Se la transazione è in dubbio, la risincronizzazione deve
essere completata con l'ubicazione proprietaria della decisione per la transazione prima che le risorse
locali possano essere sottoposte a commit o a rollback.
Quando viene presa la decisione per una transazione, i seguenti messaggi potrebbero essere inviati alla
registrazione lavoro per il lavoro del server di database.
CPI8351
Si sta eseguendo il rollback di &1 modifiche in sospeso
CPC8355
Ripristino post-IPL della definizione di commit &8 per il lavoro &19/&18/&17 completato.
CPD835F
Il ripristino IPL della definizione di commit &8 per il lavoro &19/&18/&17 ha avuto esito
negativo,
Possono essere inviati anche altri messaggi correlati al ripristino. Questi messaggi vengono inviati alla
registrazione cronologica (QHST). Se si verificano degli errori, dei messaggi vengono inviati anche alla
coda messaggi QSYSOPR.
È possibile determinare l'avanzamento del ripristino utilizzando System i Navigator, visualizzando la
registrazione lavoro per il lavoro del server di database oppure utilizzando il comando WRKCMTDFN
68
IBM i: Database Controllo del commit
(Gestione definizioni di commit). Anche se con System i Navigator e la visualizzazione Gestione
definizioni di commit è possibile forzare il sistema ad eseguire il commit o il rollback, è necessario
ricorrere a questa operazione solo quando non ci sono alternative. Se si prevede che tutte le ubicazioni
che hanno partecipato alla transazione verranno eventualmente restituite allo stato operativo, è necessario
consentire ai sistemi di risincronizzarsi. Questo assicura l'integrità dei database.
Concetti correlati
“Considerazioni sui lotti dischi indipendenti per le definizioni di commit” a pagina 22
Quando si utilizzano i lotti dischi indipendenti, è necessario tenere presenti le seguenti considerazioni per
le definizioni di commit.
“Stati della transazione per il controllo del commit a due fasi” a pagina 31
Una definizione di commit viene stabilita su ciascuna ubicazione che fa parte della rete del programma di
transazione. Per ciascuna definizione di commit, il sistema tiene traccia dello stato della sua transazione
corrente e della transazione precedente.
Gestione di transazioni e controllo del commit
Utilizzando queste istruzioni, è possibile visualizzare le informazioni di controllo del commit e
ottimizzare le prestazioni per il controllo del commit.
Visualizzazione delle informazioni sul controllo del commit
System i Navigator può visualizzare informazioni su tutte le transazioni (unità di lavoro logiche) sul
sistema. System i Navigator può anche visualizzare eventuali informazioni sul lavoro associate a una
transazione.
Nota: queste operazioni di visualizzazione non visualizzano il livello di isolamento per le applicazioni
SQL.
Per visualizzare le informazioni, procedere nel seguente modo:
1. Da System i Navigator, espandere il sistema che si desidera utilizzare.
2. Espandere Database.
3. Espandere il sistema che si desidera gestire.
4. Espandere Transazioni.
Nota: per visualizzare una transazione associata a una transazione globale X/Open, espandere
Transazioni globali. Per visualizzare una transazione gestita da DB2, espandere Transazioni
database.
5. Espandere Transazioni globali o Transazioni database.
Questa visualizzazione mostra le seguenti informazioni:
v ID unità di lavoro
v Stato unità di lavoro
v Lavoro
v
v
v
v
Utente
Numero
Risincronizzazione in corso
Definizione di commit
La guida in linea fornisce informazioni su tutte le visualizzazioni di stato e sui campi contenuti in
ciascuna visualizzazione.
Controllo del commit
69
Attività correlate
“Rilevazione di condizioni di stallo” a pagina 115
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
“Ripristino delle transazioni dopo un errore nelle comunicazioni” a pagina 116
Queste istruzioni aiutano a gestire le transazioni che eseguono delle attività su un sistema remoto dopo
che si è verificato un errore nelle comunicazioni con tale sistema.
“Quando forzare le opzioni di commit e di rollback e quando annullare la risincronizzazione” a pagina
117
La decisione di forzare un'operazione di commit o di rollback viene detta decisione euristica. Questa azione
abilita un operatore ad eseguire il commit o il rollback manualmente delle risorse per una transazione che
è in uno stato Preparato.
“Ricerca di transazioni di grandi dimensioni oppure obsolete” a pagina 119
Utilizzare il comando WRKCMTDFN (Gestione definizioni di commit) per trovare transazioni di grandi
dimensioni oppure obsolete.
Visualizzazione di oggetti bloccati per una transazione
È possibile visualizzare degli oggetti bloccati per le transazioni globali solo con i blocchi nell'ambito della
transazione.
Per visualizzare gli oggetti bloccati per una transazione, attenersi alla seguente procedura:
1. Da System i Navigator, espandere il sistema che si desidera utilizzare.
2. Espandere Database.
3. Espandere il sistema che si desidera gestire.
4. Espandere Transazioni.
5. Espandere Transazioni globali.
6. Fare clic con il tasto destro del mouse sulla transazione che si desidera gestire e selezionare Oggetti
bloccati.
Attività correlate
“Rilevazione di condizioni di stallo” a pagina 115
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
Visualizzazione di lavori associati a una transazione
Per visualizzare i lavori associati a una transazione, attenersi alla seguente procedura.
1.
2.
3.
4.
5.
6.
Dalla finestra System i Navigator, espandere il sistema che si desidera utilizzare.
Espandere Database.
Espandere il sistema che si desidera gestire.
Espandere Transazioni.
Espandere Transazioni globali o Transazioni database.
Fare clic con il tasto destro del mouse sulla transazione che si desidera gestire e selezionare Lavori.
Per le transazioni del database e quelle globali, con blocchi di lavori aperti, viene visualizzato un elenco
di lavori associati alla transazione.
Per transazioni globali con blocchi nell'ambito della transazione, viene visualizzato un elenco di lavori a
cui è collegato questo oggetto transazione o che sono in attesa del collegamento con questo oggetto
transazione
70
IBM i: Database Controllo del commit
Attività correlate
“Rilevazione di condizioni di stallo” a pagina 115
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
Visualizzazione dello stato risorsa di una transazione
Per visualizzare lo stato risorsa di una transazione, attenersi alla seguente procedura.
1. Dalla finestra System i Navigator, espandere il sistema che si desidera utilizzare.
2. Espandere Database.
3. Espandere il sistema che si desidera gestire.
4. Espandere Transazioni.
5. Espandere Transazioni globali o Transazioni database.
6. Fare clic con il tasto destro del mouse sulla transazione che si desidera gestire e selezionare Stato
risorsa.
Visualizzazione delle proprietà delle transazioni
Per visualizzare le proprietà delle transazioni, attenersi alla seguente procedura.
1. Dalla finestra System i Navigator, espandere il sistema che si desidera utilizzare.
2.
3.
4.
5.
6.
Espandere Database.
Espandere il sistema che si desidera gestire.
Espandere Transazioni.
Espandere Transazioni globali o Transazioni database.
Fare clic con il tasto destro del mouse sulla transazione che si desidera gestire e selezionare Proprietà.
Ottimizzazione delle prestazioni per il controllo del commit
L'utilizzo del controllo del commit richiede delle risorse che possono influenzare le prestazioni del
sistema. Diversi fattori influenzano le prestazioni del sistema relativamente al controllo del commit.
Un fattore che non influenza le prestazioni
Aprire un file
Se si apre un file senza specificare l'opzione di apertura del commit, non viene utilizzata alcuna
risorsa di sistema aggiuntiva, anche se è stata avviata una definizione di commit. Per ulteriori
informazioni sulla specifica dell'opzione di apertura del commit, consultare l'appropriato manuale
di riferimento HLL (high-level language).
Fattori che riducono le prestazioni
Giornale
La registrazione su giornale di un file richiede delle risorse di sistema. Tuttavia, nella maggior
parte dei casi, la registrazione su giornale ha prestazioni migliori con il controllo del commit che
senza il controllo del commit. Se si specificano solo immagini-successive, il controllo del commit
modifica questa specifica indicando sia immagini-precedenti sia immagini-successive mentre è
effettivo il controllo del commit. Questa è di norma una considerazione relativa allo spazio, non
alle prestazioni.
Operazione di commit
Se sono state apportate delle modifiche alle risorse registrate su giornale durante la transazione,
ogni commit di una transazione aggiunge due voci a ciascun giornale correlato a queste risorse. Il
numero di voci aggiunte può aumentare in modo significativo per un volume elevato di piccole
transazioni. È possibile inserire i ricevitori di giornale in un lotto dischi separato rispetto ai
giornali.
Controllo del commit
71
Operazione di rollback
Poiché il controllo del commit deve eseguire il rollback delle modifiche in sospeso registrate nel
database, sono richieste delle risorse di sistema aggiuntive quando si verifica un rollback. Inoltre,
se delle modifiche di record sono in sospeso, un'operazione di rollback causa l'aggiunta di voci
aggiuntive al giornale.
Comandi STRCMTCTL (Avvio controllo commit) e ENDCMTCTL (Fine controllo commit)
Per il sistema si verifica un sovraccarico aggiuntivo ogni volta che una definizione di commit
viene avviata utilizzando il comando STRCMTCTL e viene terminata utilizzando il comando
ENDCMTCTL. Evitare di utilizzare i comandi STRCMTCTL e ENDCMTCTL per ciascuna
transazione. Utilizzarli sono quando necessario. È possibile stabilire una definizione di commit
all'inizio di un lavoro interattivo e utilizzarla per la durata del lavoro.
Utilizzare più di un giornale per le transazioni di controllo del commit.
Con il commit in due fasi, i file aperti sotto il controllo del commit possono essere registrati su
giornale in più di un giornale. Tuttavia, l'utilizzo di più di un giornale richiede delle risorse di
sistema aggiuntive per gestire la definizione di commit. L'utilizzo di più di un giornale può anche
rendere il ripristino più complicato.
Blocco di record
Il blocco di record può interessare altre applicazioni. Il numero di record bloccati in uno specifico
lavoro aumenta le risorse di sistema globali utilizzate per il lavoro. Le applicazioni che devono
accedere allo stesso record devono attendere la fine della transazione.
Richiedere SEQONLY(*YES)
Se si richiede l'opzione SEQONLY(*YES) (utilizzando il comando OVRDBF oppure il programma
applicativo prova implicitamente a utilizzare SEQONLY(*YES)) e il file viene aperto solo per
l'immissione sotto il controllo del commit con LCKLVL(*ALL), l'opzione viene modificata in
SEQONLY(*NO). Questa opzione può influenzare le prestazioni dei file di immissione perché i
record non verranno bloccati.
Richiedere una modifica a livello di record per un file di database quando è attiva l'elaborazione di
salvataggio durante l'utilizzo o di attesa IASP (Independent ASP)
Una richiesta per eseguire una modifica a livello di record sotto il controllo del commit per un
file di database potrebbe essere ritardata se la definizione di commit è a un limite di commit e
un'operazione di salvataggio durante l'utilizzo o di attesa IASP (Independent ASP) è in
esecuzione in un lavoro differente. Per l'operazione di salvataggio durante l'utilizzo, questo può
verificarsi quando un file viene registrato su giornale sullo stesso giornale di alcuni degli oggetti
nella richiesta di salvataggio.
Nota: la colonna Stato del comando WRKACTJOB (Gestione lavori attivi) visualizza CMTW (in
attesa di commit) quando un lavoro è congelato per l'elaborazione del checkpoint del
salvataggio durante l'utilizzo.
Modifiche di commit o rollback quando l'elaborazione di salvataggio durante l'utilizzo o di attesa
IASP (Independent ASP) è attiva
Un'operazione di commit o di rollback può essere ritardata a un limite di commit quando
un'operazione di salvataggio durante l'utilizzo o di attesa IASP (Independent ASP) è in
esecuzione in un lavoro differente. Questo può verificarsi quando una risorsa di commit API è
stata precedentemente aggiunta alla definizione di commit, a meno che non si verifichi una delle
seguenti condizioni:
v Per l'operazione di salvataggio durante l'utilizzo, la risorsa API è stata aggiunta utilizzando
l'API (Aggiunta risorsa di commit) e il campo che indica che è consentita la normale
elaborazione di salvataggio ha un valore di Y.
v Per l'operazione di attesa dell'IASP (Independent ASP), la risorsa API è stata aggiunta
utilizzando l'API QTNADDCR e il campo Concessione stato di attesa IASP ha un valore di Y.
Poiché il lavoro viene detenuto durante la richiesta di commit o di rollback e poiché una richiesta
di commit o di rollback può essere eseguita solo per una singola definizione di commit per volta,
72
IBM i: Database Controllo del commit
i lavori con più di una definizione di commit con le risorse di commit API possono impedire il
completamento di un'operazione di salvataggio durante l'utilizzo o di attesa dell'IASP
(Independent ASP).
Nota: se si utilizza il nuovo salvataggio con la funzione di transazioni parziali, l'oggetto può
essere salvato senza terminare una definizione di commit.
Richiedere una modifica a livello di oggetto quando l'elaborazione di salvataggio durante l'utilizzo o
di attesa IASP (Independent ASP) è attiva
Una richiesta per eseguire una modifica a livello di oggetto sotto il controllo del commit potrebbe
essere ritardata se la definizione di commit è a un limite di commit e un'operazione di
salvataggio durante l'utilizzo o di attesa IASP (Independent ASP) è in esecuzione in un lavoro
differente. Questo può verificarsi quando viene eseguita una modifica a livello di oggetto mentre
l'operazione di salvataggio durante l'utilizzo o di attesa dell'IASP (Independent ASP) è in
esecuzione sulla libreria che contiene l'oggetto. Ad esempio, l'operazione di creazione della tabella
SQL sotto il controllo del commit per la tabella MYTBL nella libreria MYSQLLIB potrebbe essere
ritardata quando un'operazione di salvataggio durante l'utilizzo o di attesa dell'IASP
(Independent ASP) è in esecuzione sulla libreria MYSQLLIB.
Nota: se il tempo di attesa supera i 60 secondi, viene inviato il messaggio di interrogazione
CPA8351 per chiedere all'utente se continuare l'attesa o se annullare l'operazione.
Aggiungere una risorsa API utilizzando l'API QTNADDCR
Una richiesta di aggiungere una risorsa di commit API utilizzando l'API QTNADDCR potrebbe
essere ritardata se tutte le definizioni di commit per il lavoro sono a un limite di commit e
un'operazione di salvataggio durante l'utilizzo o di attesa dell'IASP (Independent ASP) è in
esecuzione in un lavoro differente.
Note:
1. Se il tempo di attesa supera i 60 secondi, viene inviato il messaggio di interrogazione
CPA8351 per chiedere all'utente se continuare l'attesa o se annullare l'operazione.
2. Per l'operazione di salvataggio durante l'utilizzo, questo non si applica alle risorse API
che erano state aggiunte utilizzando l'API QTNADDCR se il campo che indica che è
consentita la normale elaborazione di salvataggio ha un valore di Y. Per l'operazione di
attesa dell'IASP (Independent ASP), questo non si applica alle risorse API che erano
state aggiunte utilizzando l'API QTNADDCR se il campo Concessione stato di attesa
IASP ha un valore di Y.
Fattori che migliorano le prestazioni
Utilizzare un giornale predefinito
L'utilizzo di un giornale predefinito può migliorare le prestazioni se si chiudono e riaprono tutti i
file sotto il controllo del commit mentre la definizione di commit è attiva. Tuttavia, l'utilizzo di un
giornale predefinito con OMTJRNE(*NONE) riduce le prestazioni delle operazioni di commit e
rollback.
Selezionare un ultimo agent
Le prestazioni vengono migliorate quando viene selezionato un ultimo agent, in quanto è
richiesto un numero minore di interazioni tra il sistema e l'ultimo agent durante un'operazione di
commit. Tuttavia, se si verifica un errore nelle comunicazioni durante un'operazione di commit,
l'operazione di commit non verrà completata finché non sarà stata completata la
risincronizzazione, indipendentemente dal valore dell'opzione Attesa risultato. Questo tipo di
errore è raro ma questa opzione consente allo scrittore dell'applicazione di considerare l'impatto
negativo derivante dal causare all'utente un'attesa indefinita del completamento della
risincronizzazione quando si verifica un errore. Valutare quanto detto rapportandolo al
miglioramento delle prestazioni fornito dall'ottimizzazione dell'ultimo agent durante delle
Controllo del commit
73
operazioni di commit eseguite correttamente. Questa considerazione è generalmente più
significativa per i lavori interattivi che per i lavori batch.
Il valore predefinito prevede che è consentito che un ultimo agent venga selezionato dal sistema
ma l'utente può modificare questo valore utilizzando l'API QTNCHGCO.
Non utilizzare l'opzione Attesa risultato
Quando le risorse remote sono sotto il controllo del commit, le esecuzioni sono migliorate quando
l'opzione Attesa risultato è impostata su N (No) e tutti i sistemi remoti supportano la presunta
fine anomala. L'opzione Attesa risultato è impostata su No dal sistema per l'applicazione DDM e
DRDA quando la prima connessione viene stabilita con un sistema remoto. Le applicazioni APPC
devono impostare esplicitamente l'opzione Attesa risultato, altrimenti verrà utilizzato il valore
predefinito di Y.
Selezionare l'opzione OK tralasciare
Le prestazioni sono migliorate quando viene selezionata l'opzione OK tralasciare.
Selezionare l'opzione Per sola lettura
Le prestazioni sono migliorate quando è selezionata l'opzione Per sola lettura.
Concetti correlati
Journal management
“Definizione di commit per un commit in due fasi: indicazione di OK tralasciare” a pagina 41
Di norma, il gestore transazioni in qualsiasi ubicazione nella rete del programma di transazione partecipa
a ogni operazione di commit o di rollback. Per migliorare le prestazioni, è possibile configurare qualcuna
o tutte le ubicazioni in una transazione per consentire al gestore transazioni di indicare che è OK
tralasciare.
“Definizione di commit per un commit in due fasi: consentire VRO (vote read-only)” a pagina 35
Di norma, un gestore transazioni partecipa a entrambe le fasi dell'elaborazione di commit. Per migliorare
le prestazioni dell'elaborazione di commit, è possibile configurare qualcuna delle ubicazioni, oppure tutte,
in una transazione per consentire al gestore transazioni di eseguire il VRO (vote read-only).
Informazioni correlate
Add Commitment Resource (QTNADDCR) API
Riduzione al minimo dei blocchi
Un modo tipico per ridurre al minimo i blocchi di record consiste nel rilasciare il blocco di record.
(Questa tecnica non funziona se è stato specificato LCKLVL(*ALL)).
Viene qui di seguito riportato un esempio di riduzione al minimo di blocchi di record rilasciando il
blocco di record. Una singola applicazione di gestione dei file di norma si attiene alla seguente procedura:
1. Visualizzare una richiesta per un'identificazione di record da modificare.
2. Richiamare il record richiesto.
3. Visualizzare il record.
4. Consentire all'utente della stazione di lavoro di apportare la modifica.
5. Aggiornare il record.
Nella maggior parte dei casi, il record è bloccato dall'accesso del record richiesto tramite l'aggiornamento.
Il tempo di attesa del record potrebbe essere superato per un altro lavoro che sta attendendo il record.
Per evitare di bloccare un record mentre l'utente della stazione di lavoro sta considerando una modifica,
rilasciare il record dopo che è stato richiamato dal database (prima che compaia la visualizzazione del
record). Occorre quindi accedere nuovamente al record prima dell'aggiornamento. Se il record è stato
modificato tra la data/ora in cui è stato rilasciato e quella in cui è stato nuovamente effettuato l'accesso
ad esso, è necessario informare l'utente della stazione di lavoro. Il programma può determinare se il
record è stato modificato salvando uno o più campi del record originale e confrontandoli con i campi
nello stesso record dopo che ne è stato eseguito il richiamo nel seguente modo:
74
IBM i: Database Controllo del commit
v Utilizzare un campo di conteggio degli aggiornamenti nel record e aggiungere 1 al campo
immediatamente prima di un aggiornamento. Il programma salva il valore originale e lo confronta con
il valore nel campo quando il record viene richiamato nuovamente. Se si è verificata una modifica,
l'utente della stazione di lavoro viene informato e viene visualizzato nuovamente il record. Il campo di
conteggio degli aggiornamenti viene modificato solo se si verifica un aggiornamento. Il record viene
rilasciato mentre l'utente della stazione di lavoro sta considerando una modifica. Se si utilizza questa
tecnica, è necessario utilizzarla in ogni programma che aggiorna il file.
v Salvare il contenuto dell'intero record di dati e confrontarlo con il record la volta successiva che viene
richiamato.
In entrambi i casi precedenti, la sequenza di operazioni impedisce il semplice utilizzo di dati descritti
esternamente in RPG dove gli stessi nomi di campo vengono utilizzati nel record master e nel file video.
L'utilizzo degli stessi nomi di campo (in RPG) non funziona perché le modifiche dell'utente della stazione
di lavoro vengono sovrapposte quando il record viene richiamato nuovamente. È possibile risolvere
questo problema spostando i dati di record in una struttura di dati. In alternativa, se si utilizza la parola
chiave DDS, RTNDTA, è possibile continuare a utilizzare i dati descritti esternamente. La parola chiave
RTNDTA consente al programma di leggere nuovamente i dati sul pannello senza che il sistema
operativo debba spostare i dati dalla visualizzazione al programma. Questo consente al programma di
effettuare le seguenti attività:
1. Richiedere l'identificazione del record.
2. Richiamare il record richiesto dal database.
3. Rilasciare il record.
4. Salvare il campo o i campi utilizzati per determinare se il record è stato modificato.
5. Visualizzare il record e attendere che l'utente della stazione di lavoro risponda.
Se l'utente della stazione di lavoro modifica il record nella visualizzazione, il programma utilizza la
seguente sequenza:
1. Richiamare nuovamente il record dal database.
2. Mettere a confronto i campi salvati per determinare se il record di database è stato modificato. Se è
stato modificato, il programma rilascia il record e invia un messaggio quando il record viene
visualizzato.
3. Richiamare il record dalla visualizzazione eseguendo un'operazione di lettura con la parola chiave
RTNDTA e aggiornare il record nel record di database.
4. Procedere alla successiva richiesta logica perché non ci sono record aggiuntivi da rilasciare se l'utente
della stazione di lavoro annulla la richiesta.
LCKLVL(*CHG) e LCKLVL(*CS) funzionano in questa situazione. Se viene utilizzato LCKLVL(*ALL), è
necessario rilasciare il blocco di record utilizzando un'operazione di commit o di rollback.
Attività correlate
“Rilevazione di condizioni di stallo” a pagina 115
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
Gestione della dimensione della transazione
Un altro modo per ridurre al minimo i blocchi di record consiste nel gestire la dimensione della
transazione.
Per questa discussione, una transazione è interattiva. (Il controllo del commit può anche essere utilizzato
per le applicazioni batch, che spesso possono essere considerate una serie di transazioni). Molte delle
stesse considerazioni sono valide per le applicazioni batch, che sono discusse nella sezione Controllo del
commit per le applicazioni batch.
Controllo del commit
75
|
|
|
|
|
|
|
|
|
|
|
|
È possibile bloccare un massimo di 500 000 000 record durante una transazione per ciascun giornale
associato alla transazione. È possibile ridurre questo limite utilizzando un file delle opzioni query
(QAQQINI). Utilizzare il parametro QRYOPTLIB del comando CHGQRYA (Modifica attributi query) per
specificare un file delle opzioni query che può essere utilizzato da un lavoro. Utilizzare il valore
COMMITMENT_CONTROL_LOCK_LEVEL nel file delle opzioni query come limite di blocco per il
lavoro. Il valore del limite di blocco viene memorizzato internamente nella cache per ciascuna definizione
di commit la prima volta che una risorsa registrata su giornale viene posta sotto il controllo del commit.
Se il limite di blocco viene modificato dopo tale punto, il valore memorizzato nella cache deve essere
aggiornato perché diventi effettivo per tale definizione di commit. Qualsiasi chiamata dell'API di
richiamo di informazioni di commit QTNRCMTI aggiorna il valore memorizzato nella cache nel lavoro
chiamante. Il nuovo valore non si applicherà alle transazioni avviate prima dell'aggiornamento della
cache.
Quando si sceglie il livello di blocco per i record, prendere in considerazione la dimensione delle
transazioni. Utilizzare la dimensione per determinare per quanto tempo i record sono bloccati prima che
termini una transazione. È necessario decidere se un'operazione di commit o di rollback per il controllo
del commit è limitata a un singolo utilizzo del tasto Invio o se la transazione consiste in molti utilizzi del
tasto Invio.
Nota: più breve è la transazione e prima il lavoro in attesa di avviare l'elaborazione del checkpoint di
salvataggio durante l'utilizzo può continuare ed essere completato.
Ad esempio, per un'applicazione di immissione di ordini, un cliente può ordinare vari articoli in un
singolo ordine richiedendo un record di dettaglio ordine e un aggiornamento del record master di
inventario per ogni articolo nell'ordine. Se la transazione è definita come l'intero ordine e ciascun utilizzo
del tasto Invio ordina un articolo, tutti i record coinvolti nell'ordine sono bloccati per la durata dell'intero
ordine. Pertanto, i record utilizzati frequentemente (come ad esempio i record master di inventario)
possono essere bloccati per lunghi periodi di tempo, impedendo l'avanzamento di altro lavoro. Se tutti gli
articoli vengono immessi con un singolo tasto Invio utilizzando un file secondario, la durata dei blocchi
per l'intero ordine è ridotta al minimo.
In generale, il numero e la durata dei blocchi devono essere ridotti al minimo in modo che diversi utenti
della stazione di lavoro possano accedere agli stessi dati senza lunghi periodi di attesa. È possibile
eseguire questa operazione non applicando i blocchi mentre l'utente immette i dati sul pannello. Alcune
applicazioni potrebbero richiedere che non più di un utente della stazione di lavoro acceda agli stessi
dati. Ad esempio, in un'applicazione di scrittura di importi con molti record di articolo aperti per cliente,
il tipico approccio consiste nel bloccare tutti i record e ritardarli finché un utente della stazione di lavoro
non ha completato la scrittura dell'importo per una specifica ricevuta.
Se l'utente della stazione di lavoro preme il tasto Invio varie volte per una transazione, è possibile
eseguire la transazione in diversi segmenti. Ad esempio:
v Il primo segmento è un'interrogazione in cui l'utente della stazione di lavoro richiede le informazioni.
v Il secondo segmento è una conferma dell'intento dell'utente della stazione di lavoro di completare
l'intera transazione.
v Il terzo segmento è il richiamo e l'aggiornamento dei record interessati.
Questo approccio consente di limitare il blocco di record a un singolo utilizzo di Invio.
Questo approccio che prevede prima l'esecuzione di un'interrogazione viene di norma utilizzato nelle
applicazioni in cui una decisione è determinata dalle informazioni visualizzate. Ad esempio, in
un'applicazione di prenotazioni di una compagnia aerea, un cliente può desiderare sapere quali sono gli
orari dei voli, le coincidenze e le disposizioni dei posti a sedere disponibili prima di decidere quale volo
prendere. Dopo che il cliente ha preso una decisione, la transazione viene immessa. Se la transazione ha
esito negativo (il volo risulta pieno), è possibile utilizzare la funzione di rollback e immettere una
76
IBM i: Database Controllo del commit
richiesta differente. Se i record sono bloccati dalla prima interrogazione finché non viene presa una
decisione, un altro addetto alle prenotazioni attenderà finché l'altra transazione non sarà stata completata.
Concetti correlati
“Controllo del commit per le applicazioni batch” a pagina 27
Le applicazioni batch possono richiedere o meno il controllo del commit. In alcuni casi, un'applicazione
batch può eseguire una singola funzione di lettura di un file di immissione e di aggiornamento di un file
master. Tuttavia, è possibile utilizzare il controllo del commit per questo tipo di applicazione se è
importante avviarla nuovamente dopo una fine anomala.
Commit soft
Il commit soft è una forma di controllo del commit che limita il numero di volte per cui il sistema scrive
delle voci di giornale associate a una transazione su disco.
Il commit soft può migliorare le prestazioni delle transazioni ma può causare la perdita di una o più
transazioni nel caso di un errore di sistema. Il controllo del commit classico su DB2 for i assicura la
durabilità delle transazioni; questo significa che, quando viene eseguito il commit di una transazione,
essa persiste sul sistema. Il commit soft non fornisce questa durabilità anche se assicura comunque
l'atomicità della transazione. In altre parole, il sistema garantisce un limite di commit, ma una o più
transazioni complete potrebbero andare perdute se si verifica un errore di sistema.
Per utilizzare il commit soft, sia per uno specifico lavoro o nell'ambito del sistema, specificare *NO nella
variabile di ambiente QIBM_TN_COMMIT_DURABLE. È possibile modificare questa variabile con il
comando ADDENVVAR (Aggiunta variabile di ambiente).
Ad esempio, per richiedere il commit soft da uno specifico lavoro, immettere il seguente comando dal
lavoro:
ADDENVVAR ENVVAR (QIBM_TN_COMMIT_DURABLE) VALUE (*NO)
Per richiedere il commit soft nell'ambito del sistema, immettere il seguente comando:
ADDENVVAR ENVVAR (QIBM_TN_COMMIT_DURABLE) VALUE (*NO) LEVEL (*SYS)
Nota: è necessario disporre dell'autorizzazione *JOBCTL per impostare questa variabile di ambiente a
livello del sistema.
Se la variabile di ambiente QIBM_TN_COMMIT_DURABLE non è stata aggiunta, o se la variabile di
ambiente è stata impostata su un valore diverso da *NO, il sistema non utilizza il commit soft; il sistema
utilizza invece il controllo del commit classico in modo tale che la durabilità delle transazioni sarà
assicurata.
È possibile controllare l'esistenza di questa nuova variabile di ambiente e il suo valore e il livello, se
esiste, utilizzando il comando WRKENVVAR (Gestione variabile di ambiente).
|
|
|
|
|
Il valore di questa variabile di ambiente viene memorizzato in cache internamente ogni volta che viene
avviato il controllo del commit. Se la variabile di ambiente viene modificata dopo tale punto, il valore
memorizzato nella cache deve essere aggiornato perché diventi effettivo. Qualsiasi chiamata dell'API di
richiamo di informazioni di commit QTNRCMTI aggiorna il valore memorizzato nella cache nel lavoro
chiamante.
Per alcune transazioni, il sistema operativo sceglie di ignorare la richiesta di commit soft ed esegue
invece un commit classico. Questo si verifica in alcuni ambienti complessi, dove sono richieste più
connessioni al database o dove sono in corso delle operazioni DDL. Il sistema operativo può determinare
quando è appropriato eseguire la richiesta e quando ha più senso eseguire un'operazione di commit
classica. Non è pertanto pericoloso richiedere un commit soft in ambienti di questo tipo.
Controllo del commit
77
Scenari ed esempi: controllo del commit
Questi scenari ed esempi mostrano in che modo una società configura il controllo del commit. In questa
raccolta di argomenti sono inclusi anche gli esempi di codice per i programmi che utilizzano il controllo
del commit.
Il seguente scenario mostra il modo in cui la JKL Toy Company implementa il controllo del commit per
tenere traccia delle transazioni sul suo database locale.
I seguenti esempi forniscono del codice di esempio per il controllo del commit. L'esercizio pratico è un
programma RPG che implementa il controllo del commit. Include un flusso logico che mostra cosa si
verifica a ogni passo del processo.
Scenario: controllo del commit
La JKL Toy Company utilizza il controllo del commit per proteggere i record di database per la
produzione e l'inventario. Questo scenario mostra in che modo la JKL Toy Company utilizza il controllo
del commit per trasferire una parte dal suo reparto di inventario al suo reparto di produzione.
Scenario: l'argomento della gestione del giornale include una descrizione dell'ambiente di rete della JKL
Toy Company. Lo scenario riportato di seguito mostra in che modo il controllo del commit agisce sul suo
sistema di produzione JKLPROD.
Questo scenario illustra i vantaggi offerti dall'utilizzo del controllo del commit in due esempi. Il primo
esempio mostra in che modo il programma di inventario della società, il programma A, può funzionare
senza il controllo del commit e i possibili problemi che possono verificarsi. Il secondo esempio mostra
come funziona il programma con il controllo del commit.
La JKL Toy Company utilizza un programma applicativo di inventario, il programma A, sul suo sistema
JKLPROD. Il programma A utilizza due record. Un record tiene traccia degli articoli conservati in
magazzino. Un altro record tiene traccia degli articoli spostati dal magazzino e utilizzati nella produzione.
Programma A senza controllo del commit
Supporre che il seguente programma applicativo non utilizza il controllo del commit. Il sistema blocca i
record letti per l'aggiornamento. I seguenti passi descrivono in che modo il programma applicativo tiene
traccia di un diodo dalla sua rimozione dal magazzino al suo trasferimento alla produzione:
v Il programma A blocca e richiama il record del magazzino. (Questa azione potrebbe richiedere un'attesa
se il record è bloccato da un altro programma).
v Il programma A blocca e richiama il record della produzione. (Anche questa azione potrebbe richiedere
un'attesa). Il programma A ora ha bloccato entrambi i record e nessun altro programma può
modificarli.
v Il programma A aggiorna il record del magazzino. Questo determina il rilascio del record in modo che
sia ora disponibile per essere letto per l'aggiornamento da qualsiasi altro programma.
v Il programma A aggiorna il record della produzione. Questo determina il rilascio del record in modo
che sia ora disponibile per essere letto per l'aggiornamento da qualsiasi altro programma.
Senza l'utilizzo del controllo del commit, è necessario risolvere un problema per fare in modo che questo
programma funzioni correttamente in tutte le circostanze. Ad esempio, si verifica un problema se il
programma A non aggiorna entrambi i record a causa di un errore di lavoro o di sistema. In questo caso,
i due file non sono congruenti; i diodi vengono rimossi dal record del magazzino ma non vengono
aggiunti al record della produzione. L'utilizzo del controllo del commit consente di assicurare che tutte le
modifiche coinvolte nella transazione siano completate o che i file vengano ripristinati al loro stato
originario se l'elaborazione della transazione viene interrotta.
78
IBM i: Database Controllo del commit
Programma A con il controllo del commit
Se viene utilizzato il controllo del commit, l'esempio precedente viene modificato nel seguente modo:
1. Il controllo del commit è avviato.
2. Il programma A blocca e richiama il record del magazzino. (Questa azione può richiedere un'attesa se
il record è bloccato da un altro programma).
3. Il programma A blocca e richiama il record della produzione. (Anche questa azione può richiedere
un'attesa). Il programma A ora ha bloccato entrambi i record e nessun altro programma può
modificarli.
4. Il programma A aggiorna il record del magazzino e il controllo del commit mantiene il blocco sul
record.
5. Il programma A aggiorna il record della produzione e il controllo del commit mantiene il blocco sul
record.
6. Il programma A esegue il commit della transazione. Le modifiche al record del magazzino e al record
della produzione vengono rese permanenti nei file. Le modifiche vengono registrate nel giornale, che
presume che saranno presenti su disco. Il controllo del commit rilascia i blocchi su entrambi i record. I
record sono ora disponibili per essere letti per l'aggiornamento da qualsiasi altro programma.
Poiché i blocchi su entrambi i record sono mantenuti dal controllo del commit finché non viene eseguito
il commit della transazione, non può verificarsi una situazione in cui un record viene aggiornato e l'altro
no. Se si verifica un errore di sistema o del passo di instradamento prima dell'esecuzione del commit
della transazione, il sistema elimina le (esegue il rollback delle) modifiche che sono state eseguite in
modo che i file siano aggiornati al punto in cui è stato eseguito il commit dell'ultima transazione.
Per ogni passo di instradamento in cui i file devono essere sotto il controllo del commit, si verificano i
passi mostrati nella seguente figura:
Controllo del commit
79
Le operazioni eseguite sotto il controllo del commit vengono registrate su giornale. La voce di giornale di
avvio del controllo del commit viene visualizzata dopo la prima voce di apertura file sotto il controllo del
commit. Questo è dovuto al fatto che la prima voce di apertura file determina quale giornale viene
utilizzato per il controllo del commit. La voce di giornale dalla prima operazione di apertura viene
quindi utilizzata per controllare le successive operazioni di apertura per assicurare che tutti i file stiano
utilizzando lo stesso giornale.
Quando si verifica un errore di sistema o di lavoro, le risorse sotto il controllo del commit vengono
aggiornate a un limite di commit. Se una transazione viene avviata ma non viene completata prima che
termini un passo di instradamento, tale transazione viene sottoposta a rollback dal sistema e non è
presente nel file dopo il termine del passo di instradamento. Se il sistema termina in modo anomalo
prima che una transazione venga completata, tale transazione viene sottoposta a rollback dal sistema e
non è presente nel file dopo un successivo IPL (initial program load) eseguito correttamente del LIC
(Licensed Internal Code - Microprogramma interno su licenza). Quando si verifica un rollback, delle voci
in ordine inverso vengono inserite nel giornale.
Si supponga, ad esempio, che la JKL Company abbia 100 diodi in stock. La produzione ne prende 20
dallo stock; il nuovo saldo è pertanto pari a 80. L'aggiornamento del database determina sia una voce di
giornale di immagine-precedente (100) sia una di immagine-successiva (80).
Si presuma che il sistema venga terminato in modo anomalo dopo la registrazione su giornale delle voci
ma prima di raggiungere il punto di commit o il punto di rollback. Dopo l'IPL, il sistema legge la voce di
80
IBM i: Database Controllo del commit
giornale e aggiorna il corrispondente record di database. Questo aggiornamento produce due voci di
giornale che invertono l'aggiornamento: la prima voce è l'immagine-precedente (80) e la seconda voce è
l'immagine-successiva (100).
Quando l'IPL viene completato correttamente dopo la fine anomala. il sistema elimina le (o esegue il
rollback delle) modifiche al database di cui non è stato eseguito il commit. Nell'esempio precedente, il
sistema elimina le modifiche dal record del magazzino perché un'operazione di commit non è presente
nel giornale per tale transazione. In questo caso, l'immagine-precedente del record di magazzino viene
inserita nel file. Il giornale contiene le modifiche sottoposte a rollback e un'indicazione che si è verificata
un'operazione di rollback.
Concetti correlati
Scenario: Journal management
Problema pratico per il controllo del commit
Questo esercizio pratico può essere di ausilio nel comprendere il controllo del commit e i suoi requisiti.
Queste operazioni presumono che l'utente abbia dimestichezza con il programma su licenza i5/OS, la
DFU (data file utility) e questa raccolta di argomenti.
Nota: utilizzando gli esempi di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
Prima di iniziare questo problema, attenersi alla seguente procedura prerequisita:
1. Creare una libreria speciale per questo esercizio pratico. Nelle istruzioni, la libreria è denominata
CMTLIB. Sostituire alle ricorrenze rilevate di CTMLIB il nome della propria libreria.
2. Creare i file di origine e una descrizione del lavoro.
Per utilizzare il controllo del commit, attenersi alla seguente procedura:
1. Creare un file fisico denominato ITMP (file master degli articoli). La DDS (data description
specification) per questo file è la seguente:
10
20
30
40
A
A
A
A
R ITMR
ITEM
ONHAND
K ITEM
2
5
0
2. Creare un file fisico denominato TRNP (file di transazioni). Questo file viene utilizzato come un file
di registrazione delle transazioni. La DDS per questo file è la seguente:
10
20
30
40
A
A
A
A
R TRNR
QTY
ITEM
USER
5 0
2
10
3. Creare un file logico denominato TRNL (logica transazioni). Questo file viene utilizzato come ausilio
nel riavvio dell'applicazione. Il campo USER è la sequenza di tipo LIFO. La DDS per questo file è la
seguente:
10
20
30
A
A
R TRNR
K USER
LIFO
PFILE (TRNP)
4. Immettere il comando STRDFU e creare un'applicazione DFU denominata ITMU per il file ITMP.
Accettare i valori predefiniti offerti da DFU durante la definizione dell'applicazione.
5. Immettere il comando CHGDTA ITMU e immettere i seguenti record per il file ITMP:
Articolo
AA
BB
CC
Disponibile
450
375
4000
Controllo del commit
81
6. Terminare il programma utilizzando F3. Questa immissione fornisce dei dati sui quali opererà il
programma.
7. Creare il programma CL di elaborazione degli articoli (ITMPCSC) nel seguente modo:
PGM
DCL &USER *CHAR LEN(10)
RTVJOBA USER(&USER)
CALL ITMPCS PARM(&USER)
ENDPGM
Questo è il programma di controllo che richiama il programma ITMPCS. Richiama il nome utente e
lo trasmette al programma di elaborazione. Questa applicazione presume che vengano utilizzati dei
nomi utente univoci.
8. Creare un file video denominato ITMPCSD dalla DDS nel seguente modo.
Esistono due formati: il primo per il pannello di richiesta di base e il secondo per consentire
all'operatore di controllare l'ultima transazione immessa. Questo file video viene utilizzato dal
programma ITMPCS.
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
25.00
26.00
27.00
28.00
29.00
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
R PROMPT
1
3
QTY
5
ITEM
2
0I
61
I
62
63
64
24
23
CA03(93 'End of program')
CA04(94 'Review last')
SETOFF(64 'No rcd to rvw')
2'INVENTORY TRANSACTIONS'
2'Quantity'
+1
ERRMSG('Invalid +
quantity' 61)
+5'ITEM'
+1
ERRMSG('Invalid +
Item number' 62)
ERRMSG('Rollback +
occurred' 63)
2'CF4 was pressed and +
there are no +
transactions for +
this user'
DSPATR(HI)
2'CF4 Review last +
transaction'
R REVW
1
QTY
5
ITEM
2
0
2'INVENTORY TRANSACTIONS'
+5'REVIEW LAST TRANSACTION'
3 2'Quantity'
+1EDTCDE(Z)
+5'Item'
+1
9. Studiare il flusso logico fornito in Flusso logico per l'esercizio pratico per il controllo del commit.
10. Immettere il comando STRSEU e immettere il sorgente nel seguente modo:
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
82
FITMP
F*
FTRNP
F*
FTRNL
F
FITMPCSD
C* Enter
C
C
C
C
UF
E
O
E
K
DISK
KCOMIT
DISK
KCOMIT
E
K
DISK
TRNR
KRENAMETRNR1
CF E
WORKSTN
parameter with User name for -TRNP- file
*ENTRY
PLIST
PARM
USER
10
LOOP
TAG
EXFMTPROMPT
IF
IBM i: Database Controllo del commit
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
25.00
26.00
27.00
28.00
29.00
30.00
31.00
32.00
33.00
34.00
35.00
36.00
37.00
38.00
39.00
40.00
41.00
42.00
43.00
44.00
45.00
46.00
47.00
48.00
49.00
50.00
51.00
52.00
53.00
54.00
55.00
56.00
57.00
58.00
59.00
60.00
61 00
62.00
63 00
64.00
65.00
66.00
67.00
C* Check for CF3 for end of program
C
93
DO
End of Pgm
C
SETON
LR
C
RETRN
C
END
C* Check for CF4 for review last transaction
C
94
DO
Review last
C* Check for existence of a record for this user in -TRNL- file
C
USER
CHAINTRNR1
64
Not found
C
64
GOTO LOOP
C
EXFMTREVW
C
GOTO LOOP
C
END
C* Access Item record
C
ITEM
CHAINITMR
62
Not found
C* Handle -not found- Condition
C
62
GOTO LOOP
C* Does sufficient quantity exist
C
ONHAND
SUB QTY
TEST
50
61 Minus
C* Handle insufficient quantity
C
61
DO
C* Release Item record which was locked by the CHAIN for update
C
EXCPTRLSITM
C
GOTO LOOP
C
END
C* Change ONHAND and update the Item record
C
Z-ADDTEST
ONHAND
C
UPDATITMR
C* Test for Special Simulation Conditions
C
ITEM
IFEQ 'CC'
C*
Simulate program need for rollback
C
QTY
IFEQ 100
C
SETON
63
Simult Rlbck
C*
ROLBK
C
GOTO LOOP
C
END
C*
Simulate an abnormal program cancellation by Div by zero
C*
Operator Should respond -C- to inquiry message
C
QTY
IFEQ 101
C
Z-ADD0
ZERO
30
C
TESTZ
DIV ZERO
TESTZ
30
Msg occurs
C
END
C*
Simulate an abnormal job cancellation by DSPLY.
C*
Operator Should System Request to another job
C*
and cancel this one with OPTION(*IMMED)
C
QTY
IFEQ 102
C
'CC=102' DSPLY
Msg occurs
C
END
C
END
ITEM=CC
C* Write the -TRNP- file
C
WRITETRNR
C* Commit the update to -ITMP- and write to -TRNPC*
COMIT
C
GOTO LOOP
OITMR
E
RLSITM
11. Immettere il comando CRTRPGPGM per creare il programma ITMPCS dal sorgente immesso nel
passo precedente.
12. Immettere il comando CALL ITMPCSC, premere Invio e premere F4. Un messaggio indica che non ci
sono immissioni per questo operatore.
13. Immettere i seguenti dati per verificare se il programma funziona correttamente:
Quantità
3
4
Articolo
AA
BB
Controllo del commit
83
14. Premere F4. Il pannello di controllo mostra l'ultimo articolo BB immesso. Immettere i seguenti dati:
Quantità
5
9000
100
102
101
Articolo
FF (Viene generato un messaggio di numero articolo non
valido).
BB (Viene generato un messaggio di errore di quantità
insufficiente).
CC (Viene generato un messaggio di rollback).
CC (Deve essere eseguita l'operazione RPG DSPLY.
Premere il tasto Invio).
CC (il programma deve visualizzare un messaggio di
interrogazione che indica che si è verificata una
condizione di divisione per zero oppure un'indicazione
della condizione di terminazione, a seconda
dell'impostazione dell'attributo di lavoro INQMSGRPY. Se
viene visualizzato il messaggio di interrogazione,
immettere C per annullare il programma RPG e quindi C
per annullare il programma CL sull'interrogazione
successiva. Questo simula una condizione di errore
imprevista).
15. Immettere il comando di visualizzazione dati DSPDTA ITMP.
Verificare se i record AA e BB sono stati aggiornati correttamente. I valori devono essere AA = 447,
BB = 371 e CC = 3697. Notare che le operazioni di sottrazione di quantità da CC sono state eseguite
ma che i record delle transazioni non sono stati scritti.
16. Creare un ricevitore di giornale per il controllo del commit. Utilizzare il comando CRTJRNRCV
(Creazione ricevitore di giornale) per creare un ricevitore di giornale denominato RCVR1 nella
libreria CMRLIB. Specificare una soglia di almeno 5000KB. Una soglia più elevata è consigliata se il
sistema dispone di una quantità sufficiente di spazio per ottimizzare il tempo tra la generazione di
nuovi ricevitori di giornale al fine di ridurre al minimo l'impatto sulle prestazioni di giornali di
modifica troppo frequenti.
17. Creare un giornale per il controllo del commit. Utilizzare il comando CRTJRN (Creazione giornale)
per creare un giornale denominato JRNTEST nella libreria CMTLIB. Poiché questo giornale viene
utilizzato solo per il controllo del commit, specificare MNGRCV(*SYSTEM) DLTRCV(*YES). Per il
parametro JRNRCV, specificare il ricevitore di giornale creato al passo 16.
18. Utilizzare il comando STRJRNPF (Avvio file fisico su giornale) con i parametri FILE(CMTLIB/ITMP
CMTLIB/TRNP) JRN(CMTLIB/JRNTEST) per registrare su giornale i file da utilizzare per il
controllo del commit.
Il parametro IMAGES utilizza un valore predefinito di *AFTER, che indica che solo le modifiche
post-immagine dei record sono presenti nel giornale. I file ITMP e TRNP hanno ora avviato la
registrazione su giornale.
Di norma, si salvano i file dopo l'avvio della registrazione su giornale. Non è possibile applicare
delle modifiche registrate su giornale a un file ripristinato che non ha lo stesso JID delle voci di
giornale. Poiché questo esercizio pratico non richiede che si applichino le modifiche registrate su
giornale, è possibile tralasciare il salvataggio dei file registrati su giornale.
19. Immettere il comando CALL ITMPCSC e immettere le seguenti transazioni:
Quantità
5
6
Articolo
AA
BB
Terminare il programma premendo F3.
20. Immettere il comando Visualizzazione giornale: DSPJRN CMTLIB/JRNTEST.
Notare le voci presenti nel giornale. La stessa sequenza di voci (R UP = aggiornamento di ITMP
seguito da R PT = record aggiunto a TRNP) si verifica nel giornale così come è stata eseguita dal
84
IBM i: Database Controllo del commit
programma. Questo è dovuto al fatto che un file logico è definito sul file fisico TRNP e il sistema
sovrascrive il valore predefinito RPG. Se non esisteva alcun file logico, viene utilizzato il presupposto
di RPG di SEQONLY(*YES) e si presenta un blocco di voci PT perché i record vengono conservati nel
buffer RPG finché il blocco non è pieno.
21. Modificare il programma CL ITMPCSC nel seguente modo (le nuove istruzioni sono presentate con
un asterisco).
*
*
*
PGM
DCL &USER *CHAR LEN(10)
RTVJOBA USER(&USER)
STRCMTCTL LCKLVL(*CHG)
CALL ITMPCS PARM(&USER)
MONMSG MSGID(RPG9001) EXEC(ROLLBACK)
ENDCMTCTL
ENDPGM
Il comando STRCMTCTL configura l'ambiente di controllo del commit. La parola LCKLVL specifica
che i record letti per l'aggiornamento ma non aggiornati possono essere rilasciati durante la
transazione. Il comando MONMSG gestisce gli eventuali messaggi di escape RPG ed esegue un
ROLLBACK in caso di fine anomala del programma RPG. Il comando ENDCMTCTL termina
l'ambiente di controllo del commit.
22. Cancellare il programma ITMPCSC esistente e crearlo nuovamente.
23. Modificare il programma RPG per eliminare i simboli di commenti alle istruzioni 2.00, 4.00, 46.00 e
65.00. Il sorgente è ora pronto per l'utilizzo con il controllo del commit.
24. Cancellare il programma ITMPCS esistente e crearlo nuovamente. Il programma è ora pronto a
operare sotto il controllo del commit.
25. Immettere il comando CALL ITMPCSC e le seguenti transazioni:
Quantità
7
8
Articolo
AA
BB
26. Utilizzare la richiesta di sistema e richiedere l'opzione per visualizzare il lavoro corrente. Quando
viene visualizzato il pannello Visualizzazione lavoro, selezionare l'opzione 16 per richiedere la
visualizzazione dello stato del controllo del commit.
Notare i valori visualizzati. Ci devono essere due commit perché nel programma sono state eseguite
due istruzioni di commit.
27. Premere F9 per visualizzare un elenco dei file sotto il controllo del commit e la quantità di attività
per ciascun file.
28. Ritornare al programma e terminarlo premendo F3.
29. Immettere DSPJRN CMTLIB/JRNTEST e notare le voci per i file e le voci di giornale speciali per il
controllo del commit:
Voce
C BC
C SC
C CM
C EC
Significato
Si è verificato un comando STRCMTCTL.
Avvio del ciclo di commit. Questo si verifica quando la
prima operazione di database nella transazione causa
l'inserimento, l'aggiornamento o la cancellazione di un
record come parte del controllo del commit.
Si è verificata l'operazione di commit.
Si è verificato un comando ENDCMTCTL.
Le immagini-precedenti e le immagini-successive (tipi R UB e R UP) del controllo del commit si
verificano automaticamente anche se in origine era stato richiesto IMAGES(*AFTER) per il giornale.
30. Immettere il comando CALL ITMPCSC e le seguenti transazioni:
Controllo del commit
85
Quantità
12
100
Articolo
AA
CC (Questa è la condizione per simulare l'esigenza per
un'applicazione di utilizzare il rollback. Il record CC nel
file ITMP, che era stato aggiornato dall'istruzione RPG
40.00, viene sottoposto a rollback).
31. Premere F4 per determinare l'ultima transazione immessa.
L'ultima transazione di cui è stato eseguito il commit è la voce per l'elemento AA.
32. Utilizzare la richiesta di sistema e richiedere l'opzione per visualizzare il lavoro corrente. Quando
viene visualizzato il pannello Visualizzazione lavoro, richiedere la visualizzazione dello stato del
controllo del commit.
Notare i valori visualizzati e come sono stati modificati dal rollback.
33. Ritornare al programma.
34. Ritornare al pannello di richiesta di base e terminare il programma premendo F3.
35. Immettere il comando DSPJRN CMTLIB/JRNTEST.
Notare le voci aggiuntive presenti nel giornale per l'utilizzo della voce di rollback (voce C RB).
Quando viene eseguito il rollback del record ITMP, nel giornale vengono inserite tre voci. Questo è
dovuto al fatto che qualsiasi modifica al file di database sotto il controllo del commit produce una
voce prima (R BR) e dopo (R UR).
36. Visualizzare le voci con il codice giornale R e questi tipi di voce: UB, UP, BR e UR. Utilizzare
l'opzione 5 per visualizzare le voci complete. Poiché il campo Quantità è in decimale compatto,
utilizzare F11 per richiedere una visualizzazione esadecimale. Notare le seguenti condizioni:
v Il valore di disponibilità del record ITMP nel record UB
v Come il valore di disponibilità viene ridotto dal record UP
v Come il record BR sia uguale al record UP
v Come il record UR restituisce il valore così come è visualizzato in origine per il record UB
L'ultima voce è la voce RB per la fine del rollback.
37. Immettere il comando CALL ITMPCSC, premere Invio e premere F4. Notare l'ultima transazione
immessa.
38. Immettere le seguenti transazioni:
Quantità
13
101
Articolo
AA
CC (Questa è la condizione per simulare una condizione
di errore imprevista che causa la terminazione del
programma. La simulazione si verifica dividendo un
campo per 0. Il programma visualizzerà un messaggio di
interrogazione o un'indicazione della condizione di
terminazione, a seconda dell'impostazione dell'attributo
di lavoro INQMSGRPY. Se viene visualizzato il messaggio
di interrogazione, immettere C per terminare il
programma. Poiché il programma CL è stato modificato
per monitorare il verificarsi di errori di programma RPG,
la seconda interrogazione che si verificava non si
verifica).
39. Immettere il comando DSPJRN CMTLIB/JRNTEST.
Si è verificato lo stesso tipo di gestione del rollback, ma questa volta il rollback è stato causato dal
parametro EXEC del comando MONMSG nel programma CL invece del programma RPG.
Visualizzare le due voci RB per appurare quale programma li ha causati.
40. Immettere il comando WRKJOB e annotare il nome lavoro completo da utilizzare successivamente.
86
IBM i: Database Controllo del commit
41. Immettere il comando CALL ITMPCSC e immettere la seguente transazione:
Quantità
14
102
Articolo
AA
CC (L'operazione RPG DSPLY deve verificarsi sulla coda
messaggi esterna. Utilizzare il tasto di richiesta sistema e
selezionare l'opzione 1 nel menu di richiesta sistema per
eseguire il trasferimento a un lavoro secondario).
42. Collegarsi al secondo lavoro e ristabilire l'ambiente.
43. Immettere il comando ENDJOB e specificare il nome lavoro completo identificato precedentemente e
l'opzione OPTION(*IMMED). Questo simula una fine anomala o una terminazione di sistema.
44. Attendere circa 30 secondi, immettere il comando CALL ITMPCSC e premere F4.
Notare l'ultima transazione sottoposta a commit. Deve essere la voce AA immessa precedentemente.
45. Ritornare al pannello di richiesta di base e terminare il programma premendo F3.
46. Immettere il comando DSPJRN CMTLIB/JRNTEST.
Si è verificato lo stesso tipo di gestione del rollback, ma questa volta il rollback è stato causato dal
sistema invece che da uno dei programmi. La voce RB è stata scritta dal programma QWTPITPP, che
è il programma di fine anomala della gestione lavoro.
A questo punto, sono state utilizzate le funzioni di base del controllo del commit. È possibile procedere
con il controllo del commit sulle proprie applicazioni oppure provare qualcuna delle altri funzioni, tipo:
v L'utilizzo di un oggetto di notifica
v Il blocco di record di sola lettura con LCKLVL(*ALL)
v Il blocco di più record nello stesso file con LCKLVL(*ALL)
Flusso logico per l'esercizio pratico
Il flusso logico può essere di ausilio nel comprendere ulteriormente questo programma pratico per il
controllo del commit. La seguente figura mostra il flusso dell'esercizio pratico per il controllo del commit.
Consultare “Passi associati al flusso logico per il programma pratico” a pagina 89 per informazioni
dettagliate su ciascuna delle operazioni illustrate nella figura.
Controllo del commit
87
88
IBM i: Database Controllo del commit
Passi associati al flusso logico per il programma pratico
Questi passi sono associati al flusso logico per l'esercizio pratico.
1. Richiamare il nome utente trasmesso come un parametro. Viene utilizzato per scrivere nel file TRNP
e anche per richiamare l'ultima transazione immessa da ciascun operatore . Questa applicazione
presume dei nomi utente univoci per gli operatori.
2. Richiedere il pannello di base utilizzando il nome formato PROMPT.
3. Se viene premuto F3, avviare una funzione di terminazione del programma.
4. Se viene premuto F4, avviare una routine per accedere all'ultima transazione immessa dall'operatore.
5. Leggere il record di articolo utilizzando il campo ITEM. Poiché il file è un file di aggiornamento,
questa richiesta blocca il record.
6. Controllare l'eventuale presenza di una condizione di non trovato nel file ITMP.
7. Se non esiste alcun record ITMP, impostare come attivo un indicatore 62 per causare il messaggio di
errore e ritornare al passo 2.
8. Sottrarre la quantità richiesta (QTY) dal saldo disponibile (ONHAND) in un'altra area di lavoro.
9. Verificare se è disponibile una quantità sufficiente per soddisfare la richiesta.
10. Se è disponibile una quantità insufficiente, rilasciare il blocco sul record nel file ITMP. Questo passo
è necessario perché la quantità non è sufficiente.
11. Impostare come attivo l'indicatore 61 per visualizzare un messaggio di errore di quantità insufficiente
e ritornare al passo 2.
12. Modificare il campo ONHAND per il nuovo saldo e aggiornare il record ITMR.
13. Controllare la presenza di una voce speciale nel campo ITEM che è possibile utilizzare per simulare
le condizioni in cui è richiesto il ROLLBACK.
14. Controllare la presenza di QTY=100. Emettere un'operazione ROLLBACK. Questo simula una
condizione in cui il programma rileva che è necessario eseguire il rollback.
15. Controllare la presenza di QTY=101. Causare un'eccezione nel programma che produrrà un
messaggio di interrogazione. Utilizzare la divisione per zero per questa funzione. L'operatore deve
immettere C per annullare il programma, a meno che l'opzione INQMSGRPH della descrizione del
lavoro non fornisca una risposta automatica. Questo simula una condizione in cui si è verificato un
errore imprevisto e l'operatore annulla il programma.
16. Controllare la presenza di QTY=102. Emettere una visualizzazione con l'operazione di interrogazione.
Questo arresta il programma a questo passo e consente l'utilizzo del tasto di richiesta sistema per
ottenere un lavoro differente. Annullare il lavoro di aggiornamento. Questo simula una condizione in
cui si è verificata una fine anomala di lavoro o di sistema durante un limite di commit.
17. Scrivere il record di transazione in TRNP.
18. Eseguire il commit dei record per la transazione e ritornare al passo 2.
19. Leggere il primo record nel percorso di accesso per il file TRNL, utilizzando USER come chiave.
Poiché questo file è in sequenza LIFO, questo sarà l'ultimo record di transazione immesso da questo
utente.
20. Controllare la presenza di una condizione di record non trovato nel file TRNL che si verifica se il file
non contiene voci per questo utente.
21. Se non ci sono record per questo utente, impostare come attivo l'indicatore 64 per causare un
messaggio di errore e ritornare al passo 2.
22. Visualizzare l'ultima transazione immessa per questo utente. Queste informazioni possono essere
utilizzate se l'operatore dimentica cosa era stato immesso precedentemente o quando viene riavviata
la transazione. Quando l'operatore risponde, ritornare al passo 2.
23. Eseguire le funzioni programma desiderate.
Controllo del commit
89
Esempio: utilizzo di un file di registrazione delle transazioni per
avviare un'applicazione
Questo esempio fornisce il codice di esempio e le istruzioni su come utilizzare un file di registrazione
delle transazioni per avviare un'applicazione dopo una fine anomala.
Nota: utilizzando gli esempi di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
Un file di registrazione delle transazioni viene utilizzato per riavviare un'applicazione dopo un errore di
sistema o di lavoro quando non viene utilizzato un oggetto di notifica. Un file di registrazione delle
transazioni viene spesso utilizzato nelle applicazioni interattive per riepilogare gli effetti di una
transazione.
Ad esempio, in un'applicazione di immissione di ordini, un record viene di norma scritto in un file di
registrazione delle transazioni per ogni articolo ordinato. Il record contiene l'articolo ordinato, la quantità
e il prezzo. Nell'applicazione di conti debitore, viene scritto un record in un file di registrazione delle
transazioni per ogni numero di conto che deve ricevere un addebito. Questo record di norma contiene
informazioni quali il numero di conto, l'importo addebitato e il fornitore.
In molte delle applicazioni dove già esiste un file di registrazione delle transazioni, un utente della
stazione di lavoro può richiedere informazioni sull'ultima transazione immessa. Aggiungendo il controllo
del commit alle applicazioni in cui già esiste un file di registrazione delle transazioni, è possibile:
v Assicurare che i file di database siano aggiornati a un limite di commit.
v Semplificare il riavvio della transazione.
È necessario poter identificare in modo univoco l'utente della stazione di lavoro se si utilizza un file di
registrazione delle transazioni per il riavvio delle applicazioni sotto il controllo del commit. Se vengono
utilizzati dei nomi di profilo utente univoci sul sistema, il nome profilo può essere inserito in un campo
nel record della registrazione della transazione. Questo campo può essere utilizzato come chiave per il
file.
I seguenti esempi presumono che venga utilizzato un file di inventario dell'ordine per eseguire le
transazioni e che già esista un file di registrazione delle transazioni. Il programma esegue le seguenti
attività:
1. Richiedere all'utente della stazione di lavoro una quantità e un numero di articolo.
2. Aggiornare la quantità nel file master di produzione (PRDMSTP).
3. Scrivere un record nel file di registrazione delle transazioni (ISSLOGL).
Se la quantità di inventario disponibile è insufficiente, il programma rifiuta la transazione. L'utente della
stazione di lavoro può chiedere al programma dove è stata interrotta l'immissione di dati perché il
numero dell'articolo, la descrizione, la quantità, il nome utente e la data vengono scritti nel file di
registrazione delle transazioni.
DDS per il file fisico PRDMSTP
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7
1.00
2.00
3.00
4.00
5.00
6.00
90
A
A
A
A
A
A
R PRDMSTR
PRODCT
DESCRP
ONHAND
K PRODCT
IBM i: Database Controllo del commit
3
20
5 0
TEXT('Master record')
COLHDG('Product' 'Number')
COLHDG('Description')
COLHDG('On Hand' 'Amount')
EDTCDE(Z)
DDS per il file fisico ISSLOGP utilizzato da ISSLOGP
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
A
A
A
A
A
A
A
A
R ISSLOGR
PRODCT
DESCRP
QTY
TEXT('Product log record')
COLHDG('Product' 'Number')
COLHDG('Description')
COLHDG('Quantity')
EDTCDE(Z)
COLHDG('User' 'Name')
EDTCDE(Y)
COLHDG('Date')
3
20
3 0
USER
DATE
10
6
0
DDS per il file logico ISSLOGL
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7
1.00
2.00
3.00
A
A
A
LIFO
PFILE(ISSLOGP)
R ISSLOGR
K USER
DDS per il file video PRDISSD utilizzato nel programma
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
REF(ISSLOGP)
R PROMPT
1
3
QTY
R
I
PRODCT
R
I
62
61
55
15
24
CA03(98 'End of program')
CA02(97 'Where am I')
20'ISSUES PROCESSING'
2'Quantity'
+1
ERRMSG('Not enough +
Qty' 62)
+6'Product'
+1
ERRMSG('No Product +
record found' 62)
2'No Previous record exists'
2'CF2 Last transaction'
R RESTART
PRODCT
R
DESCRP
R
QTY
R
1 20'LAST TRANSACTION +
INFORMATION'
5 2'Product'
+1
7 2'Description'
+1
9 2'Qty'
+1REFFLD(QTY)
Questo processo è illustrato nel Flusso di programma.
Controllo del commit
91
92
IBM i: Database Controllo del commit
Il codice operazione RPG COMMIT viene specificato dopo l'aggiornamento del file PRDMSTP e la
scrittura del record nel file di registrazione delle transazioni. Poiché ogni richiesta all'operatore
rappresenta un limite per una nuova transazione, la transazione viene considerata come una transazione
a singolo Invio.
Il nome utente viene trasmesso al programma quando viene richiamato. Il percorso di accesso per il file
di registrazione delle transazioni è definito in sequenza LIFO (last-in-first-out) in modo che il programma
possa accedere facilmente all'ultimo record immesso.
L'utente della stazione di lavoro può riavviare il programma dopo un errore di sistema o di lavoro
utilizzando la stessa funzione che ha identificato il punto in cui è stata arrestata l'immissione di dati. Non
è necessario aggiungere nuovo codice al programma. Se si sta attualmente utilizzando un file di
registrazione delle transazioni ma non lo si sta utilizzando per appurare il punto in cui ci si trova,
aggiungere il nome utente al file di registrazione delle transazioni (presumendo che i nomi utente siano
univoci) e utilizzare questo approccio nel programma.
Il seguente esempio mostra il programma RPG utilizzato. Le istruzioni richieste per il controllo del
commit sono contrassegnate con delle frecce (==>).
Programma RPG
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... .. 7 ..
=>1.00
FPRDMSTP UP E
K
DISK
KCOMIT
=>2.00
FISSLOGL IF E
K
DISK
KCOMIT
3.00
PRDISSD CP E
WORKSTN
4.00
*ENTRY
PLIST
5.00
PARM
USER
10
6.00
C*
7.00
C* Initialize fields used in Trans Log Rcd
8.00
C*
9.00
C
MOVE UDATE
DATE
10.00
C*
11.00
C* Basic processing loop
12.00
C*
13.00
C
LOOP
TAG
14.00
C
EXFMTPROMPT
15.00
C
98
GOTO END
End of pgm
16.00
C
97
DO
Where am I
17.00
C
EXSR WHERE
18.00
C
GOTO LOOP
19.00
C
END
20.00
C
PRODCT
CHAINPRDMSTR
61
Not found
21.00
C
61
GOTO LOOP
22.00
C
ONHAND
SUB QTY
TEST
50
62
Less than
23.00
C
62
DO
Not enough
24.00
C
EXCPTRLSMST
Release lock
25.00
C
GOTO LOOP
26.00
C
END
27.00
C*
28.00
C* Update master record and output the Transaction Log Record
29.00
C*
30.00
C
Z-ADDTEST
ONHAND
31.00
C
UPDATPRDMSTR
32.00
C
WRITEISSLOGR
=>33.00
C
COMIT
34.00
C
GOTO LOOP
35.00
C*
36.00
C* End of program processing
37.00
C*
38.00
C
END
TAG
39.00
C
SETON
LR
Controllo del commit
93
40.00
41.00
42.00
43.00
44.00
45.00
46.00
47.00
C*
C* WHERE subroutine for "Where am I" requests
C*
C
WHERE
BEGSR
C
USER
CHAINISSLOGL
C N55
EXFMTRESTART
C
ENDSR
OPRDMSTR E
RLSMST
55
Not found
Programma CL utilizzato per richiamare il programma RPG PRDISS
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
PGM
DCL
STRCMTCTL
RTVJOBA
CALL
MONMSG
ENDCMTCTL
ENDPGM
&USER *CHAR LEN(10)
LCKLVL(*CHG)
USER(&USER)
PRDISS PARM(&USER)
MSGID(RPG900l) EXEC(ROLLBACK)
Per utilizzare il controllo del commit in questo programma, viene normalmente specificato un livello di
blocco *CHG. Il record viene bloccato dalla modifica finché non viene eseguita un'operazione di commit.
Notare che se è presente una quantità insufficiente di inventario, il record viene rilasciato in modo
esplicito. (Se il record non viene rilasciato in modo esplicito nel programma, viene rilasciato quando il
successivo record viene letto per l'aggiornamento dal file).
In questo esempio, l'utilizzo del livello di blocco *ALL non comporta alcun vantaggio aggiuntivo. Se
viene utilizzato *ALL, è necessario utilizzare un'operazione di rollback o di commit per rilasciare il record
quando la quantità disponibile è risultata insufficiente.
Il codice precedente è un programma CL che richiama il programma RPG PRDISS. Notare l'utilizzo di
comandi STRCMTCTL/ENDCMTCTL. Il nome utente univoco viene richiamato (comando RTVJOBA) e
trasmesso al programma. L'utilizzo del comando MONMSG per causare un rollback è descritto
nell'Esempio: utilizzo di un programma di elaborazione standard per avviare un'applicazione.
Concetti correlati
“Esempio: utilizzo di un programma di elaborazione standard per avviare un'applicazione” a pagina 101
Un programma di elaborazione standard è un modo per riavviare l'applicazione utilizzando un singolo
file di database come oggetto di notifica per tutte le applicazioni. Questo approccio presume che i nomi
di profilo utente siano univoci in base all'utente per tutte le applicazioni che utilizzano il programma
standard.
“Esempio: oggetto di notifica univoco per ciascun programma” a pagina 96
L'utilizzo di un singolo oggetto di notifica univoco per ciascun lavoro consente l'utilizzo di
un'identificazione di commit descritta esternamente anche se potrebbero esserci più utenti dello stesso
programma.
Esempio: utilizzo di un oggetto di notifica per avviare un'applicazione
Quando viene avviato dopo una fine anomala, un programma può cercare una voce nell'oggetto di
notifica. Se la voce esiste, il programma può riavviare una transazione. Dopo che la transazione è stata
avviata nuovamente, l'oggetto di notifica viene cancellato dal programma per evitare che avvii la stessa
transazione un'ennesima volta.
È possibile utilizzare un oggetto di notifica nei seguenti modi:
v Se l'identificazione di commit viene inserita in un file di database, eseguire la query di questo file per
determinare dove riavviare ciascun lavoro di applicazione o di stazione di lavoro.
94
IBM i: Database Controllo del commit
v Se l'identificazione di commit viene inserita in una coda messaggi per una specifica stazione di lavoro,
un messaggio può essere inviato agli utenti della stazione di lavoro quando si collegano per informarli
dell'ultima transazione di cui è stato eseguito il commit.
v Se l'identificazione di commit viene inserita in un file di database che ha un nome utente o una chiave,
il programma può leggere questo file quando viene avviato. Se esiste un record nel file, riavviare il
programma. Il programma può inviare un messaggio all'utente della stazione di lavoro che identifica
l'ultima transazione di cui è stato eseguito il commit. Eventuali ripristini vengono eseguiti dal
programma. Se nel file di database esisteva un record, il programma cancella tale record alla fine del
programma.
v Per un'applicazione batch, l'identificazione di commit può essere inserita in un'area di dati che contiene
i totali, le impostazioni di commutazione e altre informazioni sullo stato che occorrono per riavviare
l'applicazione. Quando viene avviata, l'applicazione accede all'area di dati e verifica i valori in essa
memorizzati. Se l'applicazione termina normalmente, l'area di dati è configurata per la successiva
esecuzione.
v Per un'applicazione batch, l'identificazione di commit può essere inviata a una coda messaggi. Un
programma eseguito quando viene avviata l'applicazione può richiamare i messaggi dalla coda e
riavviare i programmi.
È possibile utilizzare diverse tecniche per riavviare le applicazioni, a seconda delle esigenze delle
applicazioni. Quando si sceglie la tecnica, considerare le seguenti informazioni:
v Quando ci sono più utenti di un programma contemporaneamente, non è possibile utilizzare una
singola area di dati come oggetto di notifica perché, dopo una fine di sistema anomala, le
identificazioni di commit per ogni utente si sovrapporranno nell'area di dati.
v La progettazione per eliminare le informazioni nell'oggetto di notifica deve gestire la situazione in cui
si verifica un errore immediatamente dopo l'utilizzo delle informazioni:
– Se le informazioni vengono cancellate immediatamente, esse non esistono se si verifica un altro
errore prima dell'elaborazione della transazione interrotta.
– Le informazioni nell'oggetto di notifica non devono essere cancellate fino alla corretta elaborazione
della transazione interrotta. In questo caso, esisterà più di una voce nell'oggetto di notifica se si
tratta di un file di database o di una coda messaggi.
– Il programma deve accedere all'ultimo record, se c'è più di una voce.
v Un oggetto di notifica non può essere utilizzato per fornire all'utente della stazione di lavoro l'ultima
transazione di cui è stato eseguito il commit perché l'oggetto di notifica viene aggiornato solo se si
verifica un errore di sistema o di lavoro o se esistono delle modifiche di cui non è stato eseguito il
commit quando un lavoro viene terminato in modo normale.
v Se per l'utente della stazione di lavoro vengono visualizzate delle informazioni, esse devono essere
significative. Questo potrebbe richiedere che il programma traduca dei codici conservati nell'oggetto di
notifica in informazioni che aiuteranno l'utente ad eseguire il riavvio.
v Le informazioni per il riavvio devono essere visualizzate se l'utente della stazione di lavoro ne ha
bisogno. È necessaria della logica aggiuntiva nel programma per evitare che le informazioni vengano
nuovamente visualizzate quando non sono più significative.
v Un singolo oggetto di notifica e un programma di elaborazione standard possono fornire una funzione
di riavvio se l'oggetto di notifica è un file di database. Questo programma di elaborazione standard
viene richiamato dai programmi che richiedono la capacità di eseguire il riavvio per ridurre al minimo
le modifiche a ogni singolo programma.
Controllo del commit
95
Concetti correlati
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
Esempio: oggetto di notifica univoco per ciascun programma
L'utilizzo di un singolo oggetto di notifica univoco per ciascun lavoro consente l'utilizzo di
un'identificazione di commit descritta esternamente anche se potrebbero esserci più utenti dello stesso
programma.
Nei seguenti esempi, un file di database viene utilizzato come un oggetto di notifica e viene utilizzato
solo da questo programma.
Il programma ha due file di database (PRDMSTP e PRDLOCP) che devono essere aggiornati per le
ricevute da inventariare. Il file video utilizzato dal programma è denominato PRDRCTD. Un file di
database, PRDRCTP, viene utilizzato come oggetto di notifica. Questo oggetto di notifica è definito per il
programma come un file e viene utilizzato anche come definizione di una struttura di dati per la
funzione di notifica.
Nota: utilizzando gli esempi di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
DDS per il file fisico PRDLOCP
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7
1.00
2.00
3.00
4.00
5.00
6.00
7.00
A
A
A
A
A
A
A
R PRDLOCR
PRODCT
LOCATN
LOCAMT
3
6
5
0
TEXT('Location record')
COLHDG('Product' 'Number')
COLHDG('Location')
COLHDG('Location' 'Amount')
EDTCDE(Z)
K PRODCT
K LOCATN
DDS per il file video PRDRCTD
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
96
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
REF(PRDMSTP)
R PROMPT
QTY
3
PRODCT
R
LOCATN
R
61
62
71
IBM i: Database Controllo del commit
CA03(98 'End of program')
SETOFF(71 'RESTART')
1 20'PRODUCT RECEIPTS'
3
2'Quantity'
OI
+1
+6'Product'
I
+1
ERRMSG('No record +
found in the +
master file' 62)
+6'Location'
I
+1REFFLD(LOCATN PRDLOCP)
ERRMSG('No record +
found in the +
location file' 62)
9
2'Last Transaction'
+6'This is restart +
information'
DSPATR(HI BL)
12
2'Quantity'
12 12'Product'
12 23'Location'
25.00
26.00
27.00
28.00
29.00
30.00
A
A
A
A
A
A
LSTPRD
LSTLOC
LSTQTY
R
R
R
LSTDSC
R
12 35'Description'
14 15REFFLD(PRODCT)
14 26REFFLD(LOCATN *SRC)
14
5REFFLD(QTY *SRC)
EDTCDE(Z)
14 35REFFLD(DESCRP)
DDS per l'oggetto di notifica e la struttura di dati descritta esternamente (PRDRCTP)
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
A
A
A
A
A
A
A
A
A
LIFO
REF(PRDMSTP)
R PRDRCTR
USER
PRODCT
DESCRP
QTY
LOCATN
K USER
10
R
R
3
R
0
REFFLD(LOCATN PRDLOCP)
Il programma elabora l'oggetto di notifica nel seguente modo:
v Inizialmente, il programma elabora casualmente l'oggetto di notifica e visualizza un record se esiste per
la chiave specifica:
– Se esistono più record, viene utilizzato l'ultimo record per questa chiave perché il file PRDRCTP è in
sequenza LIFO.
– Se non esiste alcun record, una transazione non è stata interrotta e quindi non è necessario
riavviarla.
– Se il programma ha esito negativo prima della prima operazione di commit eseguita correttamente,
non valuta che è richiesto il riavvio.
v La routine per cancellare i dati dall'oggetto di notifica si trova alla fine del programma:
– Se si sono verificati più malfunzionamenti, la routine può gestire la cancellazione di più record
nell'oggetto di notifica.
– Anche se il sistema inserisce l'identificazione di commit in un file di database, l'identificazione di
commit deve essere specificata come una variabile nel programma RPG.
– Poiché RPG consente la descrizione esterna di una struttura di dati, una struttura di dati è un modo
pratico per specificare l'identificazione di commit. In questo esempio, la struttura di dati utilizza la
stessa descrizione esterna utilizzata dal file di database come oggetto di notifica.
L'elaborazione per questo programma richiede all'utente un numero di prodotto, un'ubicazione e una
quantità:
v Devono essere aggiornati due file:
– Il file master del prodotto (PRDMSTP)
– Il file di ubicazione del prodotto (PRDLOCP)
v In ciascun file deve esistere un record prima che l'uno o l'altro venga aggiornato.
v Il programma sposta i campi di immissione ai corrispondenti ultimi campi dopo la corretta immissione
di ciascuna transazione. Questi ultimi campi vengono visualizzati all'operatore su ciascuna richiesta
come feedback dell'immissione più recente.
v Se le informazioni per il riavvio esistono, vengono spostate a questi ultimi campi e sul pannello viene
presentato un messaggio speciale.
Questo processo è illustrato nella seguente figura. Il nome utente viene trasmesso al programma per
fornire un record univoco nell'oggetto di notifica.
Controllo del commit
97
98
IBM i: Database Controllo del commit
Il seguente esempio è relativo al codice sorgente RPG. L'oggetto di notifica (file PRDRCTP) viene
utilizzato come un file normale all'inizio e alla fine del programma e viene specificato anche come
oggetto di notifica nel CL (comando STRCMTCTL) prima di richiamare il programma.
Sorgente RPG
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
25.00
26.00
27.00
28.00
29.00
30.00
31.00
32.00
33.00
34.00
35.00
36.00
37.00
38.00
39.00
40.00
41.00
42.00
43.00
44.00
45.00
46.00
47.00
48.00
49.00
50.00
51.00
52.00
53.00
54.00
55.00
57.00
FPRDMSTP UF E
K
DISK
KCOMIT
FPRDLOCP UF E
K
DISK
KCOMIT
FPRDRCTD CF E
WORKSTN
F*
F* The following file is the specific notify object for this pgm.
F*
It is accessed only in a restart situation and at the
F*
end of the program to delete any records. The records
F*
are written to the notify object by Commitment Control.
F*
FPRDRCTP UF E
K
DISK
ICMTID
E DSPRDRCTP
C
*ENTRY
PLIST
C
PARM
USER10 10
C
MOVE USER10
USER
C*
C* Check for restart information - get last rcd per user
C*
PRDRCTP file access path is in LIFO sequence
C*
C
USER
CHAINPRDRCTR
20
Not found
C N20
DO
Restart
C
EXSR MOVLST
Move to last
C
SETON
71
Restart
C
END
C*
C* Basic processing loop
C*
C
L00P
TAG
C
EXFMTPROMPT
C
98
GOTO END
End of pgm
C
PRODCT
CHAINPRDMSTR
61
Not found
C
61
GOTO L00P
C
KEY
KLIST
C
KFLD
PRODCT
C
KFLD
LOCATN
C
KEY
CHAINPRDLOCR
62
Not found
C
62
DO
C
EXCPTRLSMST
Release lck
C
GOTO L00P
C
END
C
ADD QTY
ONHAND
Add
C
ADD QTY
LOCAMT
C
UPDATPRDMSTR
Update
C
UPDATPRDLOCR
Update
C*
C* Commit and move to previous fields
C*
C
CMTID
COMIT
C
EXSR MOVLST
Move to last
C
GOTO L00P
C*
C* End of program processing
C*
C
END
TAG
C
SETON
LR
C*56.00
C* Delete any records in the notify object
C*
Controllo del commit
99
58.00
59.00
60.00
61.00
62.00
63.00
64.00
65.00
66.00
67.00
68.00
69.00
70.00
71.00
72.00
73.00
C
DLTLP
TAG
C
USER
CHAINPRDRCTR
20
C N20
DO
C
DELETPRDRCTR
C
GOTO DLTLP
C
END
C*
C* Move to -Last Used- fields for operator feedback
C*
C
MOVLST
BEGSR
C
MOVE PRODCT
LSTPRD
C
MOVE LOCATN
LSTLOC
C
MOVE QTY
LSTQTY
C
MOVE DESCRP
LSTDSC
C
ENDSR
OPRDMSTR E
RLSMST
Not found
Delete
Concetti correlati
“Esempio: utilizzo di un file di registrazione delle transazioni per avviare un'applicazione” a pagina 90
Questo esempio fornisce il codice di esempio e le istruzioni su come utilizzare un file di registrazione
delle transazioni per avviare un'applicazione dopo una fine anomala.
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
“Esempio: oggetto di notifica singolo per tutti i programmi”
L'utilizzo di un singolo oggetto di notifica per tutti i programmi è vantaggioso. Questo è dovuto al fatto
che tutte le informazioni richieste per il riavvio si trovano nello stesso oggetto ed è possibile utilizzare un
approccio standard all'oggetto di notifica in tutti i programmi.
Esempio: oggetto di notifica singolo per tutti i programmi
L'utilizzo di un singolo oggetto di notifica per tutti i programmi è vantaggioso. Questo è dovuto al fatto
che tutte le informazioni richieste per il riavvio si trovano nello stesso oggetto ed è possibile utilizzare un
approccio standard all'oggetto di notifica in tutti i programmi.
In questa situazione, utilizzare una combinazione univoca di identificazioni di utente e programma per
assicurare che il programma acceda alle informazioni corrette al suo riavvio.
Poiché le informazioni richieste per il riavvio potrebbero variare da programma a programma, non
utilizzare una struttura di dati descritta esternamente per l'identificazione di commit. Se viene utilizzato
un singolo oggetto di notifica, il precedente programma può descrivere la struttura di dati all'interno del
programma piuttosto che esternamente. Ad esempio:
1
11
21
24
30
50
52
10
20
23
29
49
51
220
0
USER
PGMNAM
PRODCT
LOCATN
DESC
QTY
DUMMY
In ogni programma che utilizza questo oggetto di notifica, le informazioni specificate per l'identificazione
di commit sono univoche per il programma (i nomi di utente e programma non sono univoci). L'oggetto
di notifica deve essere abbastanza grande da contenere la quantità massima di informazioni che un
programma può inserire nell'identificazione di commit.
100
IBM i: Database Controllo del commit
Concetti correlati
“Esempio: oggetto di notifica univoco per ciascun programma” a pagina 96
L'utilizzo di un singolo oggetto di notifica univoco per ciascun lavoro consente l'utilizzo di
un'identificazione di commit descritta esternamente anche se potrebbero esserci più utenti dello stesso
programma.
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
Esempio: utilizzo di un programma di elaborazione standard per
avviare un'applicazione
Un programma di elaborazione standard è un modo per riavviare l'applicazione utilizzando un singolo
file di database come oggetto di notifica per tutte le applicazioni. Questo approccio presume che i nomi
di profilo utente siano univoci in base all'utente per tutte le applicazioni che utilizzano il programma
standard.
Nota: utilizzando questo esempio di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
Per questo approccio, il file fisico NFYOBJP viene utilizzato come oggetto di notifica e definito come:
Nome profilo utente univoco
Identificazione programma
Informazioni per riavvio
10 caratteri
10 caratteri
Campo caratteri
(Deve essere abbastanza grande
da contenere la quantità massima di
informazioni per riavviare
i programmi che richiedono informazioni
per il riavvio.
Questo campo è richiesto dai
programmi applicativi.
Nell'esempio, si presume che abbia
una lunghezza di 200).
Il file viene creato con SHARE(*YES). I primi due campi nel file sono la chiave per il file. (Questo file può
anche essere definito come una struttura di dati nei programmi RPG).
Concetti correlati
“Esempio: utilizzo di un file di registrazione delle transazioni per avviare un'applicazione” a pagina 90
Questo esempio fornisce il codice di esempio e le istruzioni su come utilizzare un file di registrazione
delle transazioni per avviare un'applicazione dopo una fine anomala.
Esempio: codice per un programma di elaborazione standard
Questo esempio mostra il codice per un programma di elaborazione standard che può essere utilizzato
per riavviare l'applicazione utilizzando un file di database come oggetto di notifica per tutte le
applicazioni.
L'applicazione presentata nel seguente esempio di codice esegue le seguenti operazioni:
1. Il programma applicativo riceve il nome utente in un parametro o lo utilizza con il nome programma
come un identificativo univoco nell'oggetto di notifica.
2. Il programma applicativo trasmette un codice di richiesta pari a R al programma di elaborazione di
commit standard, che determina se nell'oggetto di notifica è presente un record.
3. Se il programma di elaborazione di commit standard restituisce un codice pari a 1, significa che è
stato trovato un record e il programma applicativo presenta le informazioni necessarie per il riavvio
all'utente.
4. Il programma applicativo procede con la normale elaborazione.
Controllo del commit
101
5. Una volta completata una transazione, i valori vengono salvati per riferimento in modo che l'utente
della stazione di lavoro possa vedere le operazioni effettuate per la transazione precedente.
Le informazioni salvate non vengono fornite dall'oggetto di notifica perché l'oggetto idi notifica viene
aggiornato solo se si verifica un errore di lavoro o sistema.
Nota: utilizzando gli esempi di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
Esempio di programma applicativo
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
25.00
26.00
27.00
28.00
29.00
30.00
31.00
32.00
33.00
34.00
35.00
36.00
37.00
38.00
39.00
40.00
41.00
42.00
43.00
44.00
45.00
46.00
47.00
48.00
49.00
50.00
51.00
102
FPRDMSTP UF E
K
DISK
KCOMIT
FPRDLOCP UF E
K
DISK
KCOMIT
FPRDRCTD CF E
WORKSTN
F*
F* The following is a compile time array which contains the
F*
restart information used in the next example
F*
E
RTXT
50 50 1
Restart text
I*
I* Data structure used for info passed to notify object
I*
ICMTID
DS
I
1 10 USER
I
11 20 PGMNAM
I
21 23 PRODCT
I
24 29 LOCATN
I
30 49 DESCRP
I
P 50 510QTY
I
52 170 DUMMY
I
171 220 RSTART
C
*ENTRY
PLIST
C
PARM
USER10 10
C*
C* Initialize fields used to communicate with std program
C*
C
MOVE USER10
USER
C
MOVEL'PRDRC2' PGMNAM
C
MOVE 'R'
RQSCOD
Read Rqs
C
CALL 'STDCMT'
C
PARM
RQSCOD 1
C
PARM
RTNCOD 1
C
PARM
CMTID 220
Data struct
C
RTNCOD
IFEQ '1'
Restart
C
EXSR MOVLST
Move to last
C SETON
71
Restart
C
END
C*
C* Initialize fields used in notify object
C*
C
MOVEARTXT,1
RSTART
Move text
C*
C* Basic processing loop
C*
C
LOOP
TAG
C
EXFMTPROMPT
C 98
GOTO END
C
PRODCT
CHAINPRDMSTR
61
Not found
C 61
GOTO LOOP
C
KEY
KLIST
C
KFLD
PRODCT
C
KFLD
LOCATN
IBM i: Database Controllo del commit
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
52.00
C
KEY
CHAINPRDLOCR
62
Not found
53.00
C
62
DO
54.00
C
EXCPTRLSMST
Release lck
55.00
C
GOTO LOOP
56.00
C
END
57.00
C
ADD QTY
ONHAND
Add
58.00
C
ADD QTY
LOCAMT
59.00
C
UPDATPRDMSTR
Update
60.00
C
UPDATPRDLOCR
Update
61.00
C*
62.00
C* Commit and move to previous fields
63.00
C*
64.00
C
CMTID
COMIT
65.00
C
EXSR MOVLST
Move to last
66.00
C
GOTO LOOP
67.00
C* End of program processing
68.00
C*
69.00
C
END
TAG
70.00
C
MOVE 'D'
RQSCOD
Dlt Rqs
71.00
C
CALL 'STDCMT'
72.00
C
PARM
RQSCOD
73.00
C
PARM
RTNCOD
74.00
C
PARM
CMTID
75.00
C
SETON
LR
76.00
C*
77.00
C* Move to -Last Used- fields for operator feedback
78.00
C*
79.00
C
MOVLST
BEGSR
80.00
C
MOVE PRODCT
LSTPRD
81.00
C
MOVE LOCATN
LSTLOC
82.00
C
MOVE DESCRP
LSTDSC
83.00
C
MOVE QTY
LSTQTY
84.00
C
ENDSR
85.00
OPRDMSTR E
RLSMST
86.00 ** RTXT
Restart Text
87.00 Inventory Menu - Receipts Option
Flusso di elaborazione:
Il programma standard viene richiamato dalle applicazioni che devono essere riavviate.
I programmi applicativi trasmettono questo elenco di parametri al programma standard:
v Codice di richiesta
v Codice di ritorno
v Nome della struttura dati (il contenuto dell'oggetto di notifica)
I codici di richiesta eseguono le seguenti operazioni:
v R (Lettura)
Richiama l'ultimo record aggiunto all'oggetto di notifica con la stessa chiave. Il codice di ritorno è
impostato come:
0
Non è disponibile alcun record (nessun riavvio richiesto).
1
Record restituito nel campo delle informazioni per il riavvio (riavvio richiesto).
v WA (Scrittura)
Scrive un record nel file. Questo codice può essere utilizzato se si utilizza un oggetto di notifica per
proprie attività. Ad esempio, se determina che la transazione deve essere riavviata, il programma può
scrivere un record per l'oggetto di notifica per simulare cosa farà il sistema se si verifica un
malfunzionamento di un lavoro o del sistema.
Controllo del commit
103
v DE (Cancellazione)
Cancella tutti i record nell'oggetto di notifica con la stessa chiave. Il codice di ritorno è impostato come:
0
Non esiste alcun record da cancellare.
1
Sono stati cancellati uno o più record.
v OE (Apertura)
Il codice richiesta O è facoltativo e viene utilizzato per evitare di dover avviare il programma di
elaborazione ogni volta che viene richiamato.
v CA (Chiusura)
Dopo che è stato utilizzato il codice di richiesta di apertura, l'utilizzo della richiesta di chiusura
assicura che il file venga chiuso.
v SA (Ricerca)
Restituisce l'ultimo record per questo utente. Il nome programma non viene utilizzato. Questo codice
può essere utilizzato in un programma iniziale per determinare se è richiesto il riavvio.
Esempio: codice per un programma di elaborazione di commit standard
Il programma di elaborazione di commit standard (STDCMT) esegue le funzioni richieste per comunicare
con un singolo oggetto di notifica utilizzato da tutte le applicazioni.
Mentre la funzione di controllo del commit scrive automaticamente una voce nell'oggetto di notifica, un
programma standard scritto dall'utente deve elaborare l'oggetto di notifica. Il programma standard
semplifica e standardizza l'approccio.
Il programma viene scritto per verificare i parametri trasmessi ed eseguire l'azione appropriata nel
seguente modo.
O=Apertura
Il programma chiamante richiede che il file di oggetto di notifica venga mantenuto aperto alla
restituzione. Poiché l'oggetto di notifica viene aperto implicitamente dal programma RPG, il
programma non lo deve chiudere. L'indicatore 98 viene impostato in modo che il programma
esegua la restituzione con LR disattivato per conservare le aree di lavoro del programma e lasci
l'oggetto di notifica aperto in modo che possa essere chiamato nuovamente senza un sovraccarico
eccessivo.
C=Chiusura
Il programma richiamante ha determinato che non ha più bisogno dell'oggetto di notifica e
richiede una chiusura. L'indicatore 98 è disattivato per consentire una chiusura completa
dell'oggetto di notifica.
R=Lettura
Il programma chiamante richiede che un record con dei campi chiave corrispondenti venga letto e
restituito. Il programma utilizza i campi chiave trasmessi per provare a richiamare un record da
NFYOBJP. Se esistono dei record duplicati per la stessa chiave, viene restituito l'ultimo record. Il
codice di ritorno viene impostato adeguatamente e, se il record esisteva, viene restituito nella
struttura di dati CMTID.
W=Scrittura
Il programma chiamante richiede che un record venga scritto nell'oggetto di notifica per
consentire il riavvio del programma chiamante la volta successiva che viene richiamato. Il
programma scrive il contenuto dei dati trasmessi come un record in NFYOBJP.
D=Cancellazione
Il programma chiamante richiede che i record per questa chiave corrispondente vengano
cancellati. Questa funzione viene di norma eseguita dopo il corretto completamento del
programma chiamante per eliminare le eventuali informazioni sul riavvio. Il programma prova a
cancellare i record per i campi chiave trasmessi. Se non esiste alcun record, viene restituito un
codice di ritorno differente.
104
IBM i: Database Controllo del commit
S=Ricerca
Il programma chiamante richiede una ricerca per un record per uno specifico utente,
indipendentemente da quale programma lo abbia scritto. Questa funzione viene utilizzata nel
programma per il collegamento per indicare che è richiesto il riavvio. Il programma utilizza solo
il nome utente come chiave per verificare se esistono i record. Il codice di ritorno viene impostato
in modo appropriato e il contenuto dell'ultimo record per questa chiave (se esiste) viene letto e
restituito.
Il seguente esempio mostra il programma di elaborazione di commit standard, STDCMT.
Programma di elaborazione di commit standard
Nota: utilizzando questo esempio di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ..
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
21.00
22.00
23.00
24.00
25.00
26.00
27.00
28.00
29.00
30.00
31.00
32.00
33.00
34.00
35.00
36.00
37.00
38.00
39.00
40.00
41.00
42.00
43.00
44.00
45.00
46.00
47.00
48.00
FNFYOBJP UF
ICMTID
I
I
I
C
C
C
C
C
C
C*
C* 'O' for
C*
C
C
C
C
C*
C* 'C' for
C*
C
C
C
C
C*
C* 'R' for
C*
C
C
C
C
C
C
51
C
51
C
C
C
C
20
C
C
C*
C* 'W' FOR
C*
C
C
C
C
E
DS
K
DISK
A
1 10 UNQUSR
11 20 UNQPGM
21 220 BIGFLD
*ENTRY
UNQUSR
UNQPGM
PLIST
PARM
PARM
PARM
CABEQ*BLANKS
CABEQ*BLANKS
RQSCOD 1
RTNCOD 1
CMTID 220
BADEND
BADEND
H1 Invalid
H2 Invalid
Open
RQSCOD
IFEQ 'O'
SETON
GOTO END
END
98
Open
End LR
Close
RQSCOD
IFEQ 'C'
SETOF
GOTO END
END
Close
98
Read - Get last record for the key
RQSCOD
KEY
KEY
LOOPl
KEY
IFEQ 'R'
KLIST
KFLD
KFLD
CHAINNFYOBJR
MOVE '0'
GOTO END
MOVE '1'
TAG
READENFYOBJR
GOTO END
GOTO LOOP1
END
Read
UNQUSR
UNQPGM
51
Not found
RTNCOD
RTNCOD
Found
20 EOF
Write
RQSCOD
IFEQ 'W'
WRITENFYOBJR
GOTO END
END
Write
Controllo del commit
105
49.00
50.00
51.00
52.00
53.00
54.00
55.00
56.00
57.00
58.00
59.00
60.00
61.00
62.00
63.00
64.00
65.00
66.00
67.00
68.00
69.00
70.00
71.00
72.00
73.00
74.00
75.00
76.00
77.00
78.00
79.00
80.00
81.00
82.00
83.00
84.00
85.00
86.00
87.00
88.00
89.00
C*
C*
C*
C
C
C
C
C
C
C
C
C
C
C
C*
C*
C*
C*
C
C
C
C
C
C
C
C
C
C
C*
C*
C*
C
C
C*
C*
C*
C
C
C
C*
C
'D' for Delete - Delete all records for the key
RQSCOD
KEY
51
51
LOOP2
KEY
N20
IFEQ 'D'
CHAINNFYOBJR
MOVE '0'
GOTO END
MOVE '1'
TAG
DELETNFYOBJR
READENFYOBJR
GOTO LOOP2
GOTO END
END
51
Delete
Not found
RTNCOD
RTNCOD
Found
20 EOF
'S' for Search for the last record for this user
(Ignore the -Program- portion of the key)
RQSCOD
UNQUSR
N20
N20
LOOP3
UNQUSR
N20
IFEQ 'S'
SETLLNFYOBJR
MOVE '0'
GOTO END
MOVE '1'
TAG
READENFYOBJR
GOTO LOOP3
GOTO END
END
Search
20 If equal
RTNCOD
RTNCOD
Found
20 EOF
Invalid request code processing
SETON
GOTO BADEND
H2
Bad RQS code
End of program processing
END
TAG
SETON
LR
RETRN
BADEND tag is used then fall thru to RPG cycle error return
BADEND
TAG
N98
Concetti correlati
“Esempio: utilizzo di un programma di elaborazione standard per decidere se riavviare l'applicazione”
Il programma iniziale può richiamare il programma di elaborazione di commit iniziale per determinare se
è necessario eseguire il riavvio. L'utente della stazione di lavoro può quindi decidere se eseguire il
riavvio.
Esempio: utilizzo di un programma di elaborazione standard per decidere se
riavviare l'applicazione
Il programma iniziale può richiamare il programma di elaborazione di commit iniziale per determinare se
è necessario eseguire il riavvio. L'utente della stazione di lavoro può quindi decidere se eseguire il
riavvio.
Il programma iniziale trasmette un codice di richiesta S (ricerca) al programma standard che ricerca un
eventuale record per l'utente. Se esiste un record, le informazioni per il riavvio vengono trasmesse al
programma iniziale e le informazioni vengono visualizzate per l'utente della stazione di lavoro.
L'identificazione di commit nell'oggetto di notifica contiene informazioni che il programma iniziale può
visualizzare identificando quale programma deve essere riavviato. Ad esempio, gli ultimi 50 caratteri
dell'identificazione di commit possono essere riservati per contenere queste informazioni. Nel programma
applicativo, queste informazioni possono trovarsi in una schiera al momento della compilazione ed essere
106
IBM i: Database Controllo del commit
spostate alla struttura di dati in un passo di inizializzazione. Esempio: codice per un programma di
elaborazione di commit standard che mostra come includere questa operazione nel programma
applicativo.
Il seguente esempio mostra un programma iniziale che determina se esiste un record nell'oggetto di
notifica.
Esempio: programma iniziale
Nota: utilizzando questo esempio di codice, si accettano i termini indicati nella sezione “Informazioni
sull'esonero di responsabilità e licenza del codice” a pagina 121.
SEQNBR *... ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
11.00
12.00
13.00
14.00
15.00
16.00
17.00
18.00
19.00
20.00
PGM
DCLF
DCL
DCL
DCL
DCL
DCL
RTVJOBA
CHGVAR
CALL
IF
CHGVAR
SNDRCVF
ENDDO
CMTINLD
&RQSCOD *CHAR LEN(1) VALUE(S) /* Search */
&RTNCOD *CHAR LEN(1)
&CMTID *CHAR LEN(220)
&USER *CHAR LEN(10)
&INFO *CHAR LEN(50)
USER(&USER)
&CMTID (&USER *CAT XX)
/* The XX is required to prevent a blank Pgm nam */
STDCMT PARM(&RQSCOD &RTNCOD &CMTID)
(&RTNCOD *EQ '1') DO /* RESTART REQD */
&INFO %SST(&CMTID 171 50)
RCDFMT(RESTART)
/*
/* Enter normal initial program statements
/*
or -TFRCTL- to first menu program
/*
*/
*/
*/
*/
ENDPGM
Concetti correlati
“Esempio: codice per un programma di elaborazione di commit standard” a pagina 104
Il programma di elaborazione di commit standard (STDCMT) esegue le funzioni richieste per comunicare
con un singolo oggetto di notifica utilizzato da tutte le applicazioni.
“Oggetto di notifica del commit” a pagina 53
Un oggetto di notifica è una coda messaggi, un'area dati o un file di database che contiene le informazioni
che identificano l'ultima transazione eseguita correttamente completata per una specifica definizione di
commit se tale definizione di commit non è stata terminata normalmente.
Risoluzione dei problemi relativi a transazioni e controllo del commit
Queste informazioni possono aiutare a risolvere gli errori di controllo del commit, rilevare le condizioni
di stallo, ripristinare le transazioni dopo un errore nelle transazioni, sapere quando forzare le operazioni
di commit e rollback e quando annullare la sincronizzazione e terminare i rollback a lunga esecuzione.
Errori del controllo del commit
Quando si utilizza il controllo del commit, è importante comprendere quali condizioni causano degli
errori e quali no.
In generale, gli errori si verificano quando le funzioni del controllo del commit vengono utilizzate in
modo non congruente, come ad esempio l'esecuzione di un comando ENDCMTCTL (Fine controllo
commit) quando i file che utilizzano la definizione di commit sono ancora aperti.
Controllo del commit
107
Errori durante l'elaborazione di commit
Se si verifica un errore di sistema o nelle comunicazioni durante un'operazione di commit, potrebbe
essere necessario eseguire la risincronizzazione per assicurare che i gestori transazioni mantengano i dati
congruenti su tutti i sistemi coinvolti nella transazione. La modalità di funzionamento della
risincronizzazione e il modo in cui essa influenza l'operazione di commit dipendono dai seguenti fattori:
v L'opzione di commit Attesa risultato.
v Lo stato della transazione.
Se l'errore è di entità tale da essere irreversibile, o se non può essere corretto nel tempo previsto, gli
operatori di sistema per gli altri sistemi coinvolti nella transazione devono prendere una decisione
euristica. La decisione euristica esegue il commit o il rollback delle modifiche apportate su tale sistema
durante la transazione. Se l'errore viene corretto dopo tale decisione, e la risincronizzazione rileva che la
decisione ha causato dei problemi di integrità dei dati, alla coda messaggi QSYSOPR viene inviato il
messaggio CPD83D9 o il messaggio CPD83E9.
Concetti correlati
“Definizione di commit per un commit in due fasi: Non attendere risultato” a pagina 37
Quando si verifica un malfunzionamento nelle comunicazioni o di sistema durante un'operazione di
commit, ed è quindi richiesta una risincronizzazione, il valore predefinito prevede di attendere che la
risincronizzazione sia terminata prima di completare l'operazione di commit.
“Stati della transazione per il controllo del commit a due fasi” a pagina 31
Una definizione di commit viene stabilita su ciascuna ubicazione che fa parte della rete del programma di
transazione. Per ciascuna definizione di commit, il sistema tiene traccia dello stato della sua transazione
corrente e della transazione precedente.
Condizioni di errore
Se si verifica un errore, viene inviato un messaggio di uscita per cui è possibile eseguire il monitoraggio
in un programma.
Sono qui di seguito riportati alcuni errori tipici correlati al controllo del commit:
v Vengono eseguiti dei comandi STRCMTCTL consecutivi senza un comando ENDCMTCTL intermedio.
v I file vengono aperti sotto il controllo del commit, ma non è stato eseguito alcun comando
STRCMTCTL.
Questa non è una condizione di errore per i programmi eseguiti in un gruppo di attivazione che
devono utilizzare la definizione di commit a livello di lavoro. La definizione di commit a livello di
lavoro può essere avviata solo da un singolo programma ma, quando viene avviata da un programma,
la definizione di commit a livello di lavoro viene utilizzata da qualsiasi programma in esecuzione in un
gruppo di attivazione che non sta utilizzando una definizione di commit a livello di gruppo di
attivazione. I programmi eseguiti in un gruppo di attivazione che devono utilizzare la definizione di
commit a livello di gruppo di attivazione devono prima avviare la definizione di commit a livello di
gruppo di attivazione con il comando STRCMTCTL.
v I file aperti per l'emissione sotto il controllo del commit non vengono registrati su giornale.
v La prima operazione di apertura di un file condiviso pone il file sotto il controllo del commit, cosa che
invece non fanno le successive operazioni di apertura dello stesso file condiviso.
v La prima operazione di apertura di un file condiviso non pone il file sotto il controllo del commit, cosa
che invece fanno le successive operazioni di apertura dello stesso file condiviso.
v Il limite di blocchi di record per il lavoro viene raggiunto in una singola transazione.
v Il programma emette un'operazione di lettura, un'operazione di commit e una modifica per lo stesso
record. L'operazione di lettura deve essere emessa nuovamente dopo l'operazione di commit perché
l'operazione di commit ha liberato il blocco sul record.
v Per un'ubicazione in una fase, le risorse poste sotto il controllo del commit non risiedono nella stessa
ubicazione delle risorse che già sono sotto il controllo del commit per la definizione di commit.
108
IBM i: Database Controllo del commit
v Delle modifiche di cui non è stato eseguito il commit esistono quando viene emesso un comando
ENDCMTCTL.
Questa non è una condizione di errore per il comando ENDCMTCTL se tutti i file sono chiusi,
l'eventuale database remoto è disconnesso e nessuna risorsa di commit API è ancora associata alla
definizione di commit da terminare.
v Viene eseguito un comando di commit, rollback o ENDCMTCTL e non è stato eseguito un comando
STRCMTCTL.
Questa non è una condizione di errore per i programmi eseguiti in un gruppo di attivazione e la
definizione di commit a livello di lavoro è attiva. La definizione di commit a livello di lavoro può
essere avviata solo da un singolo programma ma, quando viene avviata da un programma, la
definizione di commit a livello di lavoro viene utilizzata da qualsiasi programma in esecuzione in un
gruppo di attivazione che non sta utilizzando una definizione di commit a livello di gruppo di
attivazione. I programmi eseguiti in un gruppo di attivazione e che devono utilizzare la definizione di
commit a livello di gruppo di attivazione devono prima avviare la definizione di commit a livello di
gruppo di attivazione con il comando STRCMTCTL.
v Un comando ENDCMTCTL viene eseguito con i file ancora aperti sotto il controllo del commit per la
definizione di commit.
v Un lavoro che esegue un'operazione di salvataggio ha una o più definizioni di commit che non si
trovano a un limite di commit.
v Un'operazione di salvataggio durante l'utilizzo è terminata perché altri lavori con delle risorse di cui è
possibile eseguire il commit non hanno raggiunto un limite di commit nel tempo specificato per il
parametro SAVACTWAIT.
v Un processo di salvataggio durante l'utilizzo non è riuscito a continuare a causa di risorse di cui è
possibile eseguire il commit API aggiunte a più di una definizione di commit per un singolo lavoro.
v Più di 1023 definizioni di commit esistono per un singolo lavoro.
v La conversazione a un'ubicazione remota si interrompe a causa di un errore di risorsa. Questo può
causare l'esecuzione del rollback della transazione.
v Una risorsa in una fase aperta per l'aggiornamento è presente su un nodo che non ha iniziato
l'operazione di commit. È necessario rimuovere la risorsa o il nodo che ha iniziato la richiesta di
commit.
v Un'operazione di commit viene richiesta mentre la transazione è in uno stato di rollback richiesto
(RBR). È necessario eseguire un'operazione di rollback.
v Un programma di uscita API emette una richiesta di commit o una richiesta di rollback.
v Un programma di trigger emette una richiesta di commit o una richiesta di rollback per la definizione
di commit sotto cui è stato richiamato il programma di trigger.
Il programma di trigger può avviare una definizione di commit separata e emettere una richiesta di
commit o di rollback per tale definizione.
Condizioni senza errori
Sono qui di seguito riportate alcune situazioni per il controllo del commit in cui non si verificano errori.
v Un'operazione di commit o di rollback viene eseguita e nessuna risorsa è sotto il controllo del commit.
Questo consente di includere le operazioni di commit o di rollback nel programma senza considerare
se ci sono risorse sotto il controllo del commit. Consente anche di specificare un'identificazione di
commit prima di eseguire modifiche di cui è possibile eseguire il commit.
v Un'operazione di commit o di rollback viene eseguita e non ci sono modifiche di risorse di cui non è
stato eseguito il commit. Questo consente di includere le operazioni di commit e rollback nel
programma senza considerare se ci sono delle modifiche di risorse di cui non è stato eseguito il
commit.
v Un file sotto il controllo del commit viene chiuso ed esistono dei record di cui non è stato eseguito il
commit. Questa situazione consente a un altro programma di essere richiamato per eseguire
l'operazione di commit o di rollback. Questo si verifica indipendentemente dal fatto che il file sia
Controllo del commit
109
condiviso o meno. Questa funzione consente a un programma secondario di apportare delle modifiche
al database che fanno parte di una transazione che interessa più programmi.
v Un lavoro termina, in modo normale o anomalo, con delle modifiche di cui non è stato eseguito il
commit per una o più definizioni di commit. Viene eseguito il rollback delle modifiche per tutte le
definizioni di commit.
v Un gruppo di attivazione termina con delle modifiche in sospeso per la definizione di commit a livello
di gruppo di attivazione. Se il gruppo di attivazione sta terminando in modo normale e non sono stati
rilevati degli errori alla chiusura dei file aperti sotto il controllo del commit incluso nell'ambito dello
stesso gruppo di attivazione che sta terminando, il sistema esegue un commit implicito. Altrimenti,
viene eseguito un rollback implicito.
v Un programma accede nuovamente a un record modificato di cui non è stato eseguito il commit.
Questo consente a un programma di:
– Aggiungere un record e aggiornarlo prima di specificare l'operazione di commit.
– Aggiornare lo stesso record due volte prima di specificare l'operazione di commit.
– Aggiungere un record e cancellarlo prima di specificare l'operazione di commit.
– Accedere nuovamente a un record di cui non è stato eseguito il commit da un file logico differente
(sotto il controllo del commit).
v Si specifica LCKLVL(*CHG o *CS) nel comando STRCMTCTL e si apre un file con un'operazione di
commit per la sola lettura. In questo caso, non si verifica alcun blocco sulla richiesta. Ne viene eseguita
l'elaborazione come se il controllo del commit non fosse effettivo ma il file non compare nell'opzione di
menu WRKJOB di file sotto il controllo del commit.
v Si emette il comando STRCMTCTL e non si apre alcun file sotto il controllo del commit. In questa
situazione, qualsiasi modifica a livello di record apportata ai file non viene eseguita sotto il controllo
del commit.
Messaggi di errore da monitorare durante il controllo del commit
Diversi messaggi di errore differenti possono essere restituiti dalle operazioni di commit o rollback o
inviati alla registrazione lavoro, a seconda del tipo di messaggio e di quando si è verificato l'errore.
I messaggi di errore possono essere generati durante la seguente elaborazione:
v Elaborazione di commit o rollback normale
v Elaborazione di commit o rollback durante la fine dell'elaborazione del lavoro
v Elaborazione di commit o rollback durante la fine del gruppo di attivazione
Non è possibile eseguire il monitoraggio per i seguenti messaggi di errore durante la fine del gruppo di
attivazione o la fine dell'elaborazione del lavoro. Inoltre, è possibile eseguire il monitoraggio solo per i
messaggi CPFxxxx. I messaggi CPDxxxx sono sempre inviati come messaggi diagnostici di cui non è
possibile eseguire il monitoraggio. Eventuali errori rilevati quando si termina una definizione di commit a
livello di gruppo di attivazione durante la terminazione del gruppo di attivazione o la fine di eventuali
definizioni di commit durante la terminazione del lavoro sono lasciati nella registrazione lavoro come
messaggi di diagnostica.
I messaggi di errore correlati al controllo del commit da cercare sono i seguenti:
CPD8351
Le modifiche potrebbero non essere state sottoposte a commit.
CPD8352
Modifiche non sottoposte a commit all'ubicazione remota &3.
CPD8353
Le modifiche al database relazionale &1 potrebbero non essere state sottoposte a commit.
CPD8354
Le modifiche al file DDM & 1 potrebbero non essere state sottoposte a commit.
110
IBM i: Database Controllo del commit
CPD8355
Le modifiche all'oggetto DDL di tipo &1 potrebbero non essere state sottoposte a commit.
CPD8356
Le modifiche di cui è stato effettuato il rollback potrebbero essere state sottoposte a commit.
CPD8358
È probabile che non sia stato eseguito il rollback delle modifiche ad un database relazionale &1.
CPD8359
È probabile che non sia stato eseguito il rollback delle modifiche al file DDM &1.
CPD835A
È probabile che non sia stato eseguito il rollback delle modifiche ad un oggetto DDL &3.
CPD835C
Oggetto di notifica &1 in &2 non aggiornato.
CPD835D
La risorsa DRDA non consente il congelamento del cursore SQL.
CPF835F
L'operazione di commit o di rollback ha avuto esito negativo.
CPD8360
I membri, i file o entrambi sono già stati disallocati.
CPD8361
Errore del programma di uscita API &1 durante il commit.
CPD8362
Il programma di uscita API &1 ha riportato un errore durante l'elaborazione di rollback.
CPD8363
Il programma di uscita API &1 è terminato dopo &4 minuti durante il commit.
CPD8364
Il programma di uscita API &1 è terminato dopo &4 minuti durante il rollback.
CPD836F
Errore del protocollo durante l'operazione di controllo del commit.
CPD83D1
La risorsa API &4 non può essere l'ultimo agent.
CPD83D2
Risorsa incompatibile con il controllo del commit.
CPD83D7
L'operazione di commit è stata modificata in quella di rollback.
CPD83D9
Si è verificata una condizione euristica mista.
CPF83DB
L'operazione di commit ha causato il rollback.
CPD83DC
'Azione in caso di problemi' è stata utilizzata per stabilire un'operazione di commit o rollback;
causa &2.
CPD83DD
La conversazione è terminata; causa &1.
CPD83DE
Le informazioni di ritorno non sono valide.
Controllo del commit
111
CPD83EC
Il programma di uscita API &1 ha stabilito il rollback.
CPD83EF
È stato avviato il rollback dell'unità logica di lavoro successiva.
CPF8350
Definizione di commit non trovata.
CPF8355
ENDCMTCTL non è consentito. Sono presenti delle modifiche in sospeso.
CPF8356
Il controllo del commit è terminato con &1 modifiche non sottoposte a commit.
CPF8358
Oggetto di notifica &1 in &2 non aggiornato.
CPF8359
L'operazione di rollback ha avuto esito negativo.
CPF835A
La chiusura della definizione di commit &1 è stata annullata.
CPF835B
Si sono verificati degli errori durante la chiusura del controllo del commit.
CPF835C
Il controllo del commit è terminato con le modifiche remote non sottoposte a commit.
CPF8363
L'operazione di commit non è riuscita.
CPF8364
Il valore del parametro relativo al controllo del commit non è valido. Il codice errore è &3.
CPF8367
Non è possibile eseguire l'operazione di controllo del commit.
CPF8369
Non è possibile porre la risorsa di commit API sotto controllo del commit; codice di errore &1.
CPF83D0
L'operazione di commit non è consentita.
CPF83D2
Commit completato == La risincronizzazione in corso è stata restituita.
CPF83D3
Commit completato == È stato restituita l'operazione Euristica mista.
CPF83D4
La voce di giornale dell'unità logica di lavoro non è stata inviata.
CPF83E1
L'operazione di commit ha avuto esito negativo a causa di una violazione di restrizione.
CPF83E2
Si richiede l'operazione di rollback.
CPF83E3
Il livello di nidificazione richiesto non è attivo.
CPF83E4
Il controllo del commit è terminato con delle risorse non sottoposte a commit.
112
IBM i: Database Controllo del commit
CPF83E6
Operazione controllo del commit completata con risincronizzazione in corso.
CPF83E7
Convalida o ripristino non consentito per la transazione globale X/Open non consentiti.
Monitoraggio del verificarsi di errori dopo un comando CALL
Quando viene richiamato un programma che utilizza il controllo del commit, monitorare se si verificano
degli errori imprevisti ed eseguire un'operazione di rollback, se si verifica un errore.
Ad esempio, dei record di cui non è stato eseguito il commit possono esistere quando un programma
rileva un errore imprevisto come ad esempio un errore di divisione per zero RPG.
In base allo stato del parametro di Risposta al messaggio di interrogazione (INQMSGRPY) per un lavoro,
il programma invia un messaggio di interrogazione o esegue un'azione predefinita. Se la risposta
dell'operazione oppure l'azione predefinita terminano il programma, i record di cui non è stato eseguito il
commit continuano a esistere, in attesa di un'operazione di commit o di rollback.
Se viene richiamato un altro programma che determina un'operazione di commit, viene eseguito il
commit della transazione completata parzialmente dal programma precedente.
Per evitare che venga eseguito il commit di transazioni completate parzialmente, monitorare la
generazione di eventuali messaggi di escape dopo il comando CALL. Ad esempio, se si tratta di un
programma RPG, utilizzare la seguente codifica:
CALL RPGA
MONMSG MSGID(RPG9001)
EXEC(ROLLBACK) /*Rollback if pgm is canceled*/
Se si tratta di un programma COBOL:
CALL COBOLA
MONMSG MSGID(CBE9001)
EXEC(ROLLBACK) /*Rollback if pgm is canceled*/
Errore di elaborazione di commit o rollback normale
Durante l'elaborazione di commit o rollback, possono verificarsi degli errori in qualsiasi momento.
La seguente tabella divide questa elaborazione in quattro situazioni. La colonna di mezzo descrive le
azioni eseguite dal sistema quando rileva degli errori durante ciascuna situazione. La terza colonna
suggerisce cosa l'utente o l'applicazione devono fare in risposta ai messaggi. Questi consigli sono
congruenti con il modo in cui l'elaborazione di controllo del commit è gestita dal sistema.
Situazione
Elaborazione di commit o rollback
Azione suggerita
Il commit di I/E a livello di record
ha esito negativo
Monitoraggio della generazione di
v Se l'errore si verifica durante la
fase di preparazione, la transazione messaggi; gestire come desiderato
viene sottoposta a rollback e viene
inviato il messaggio CPF83DB.
v Se l'errore si verifica durante la
fase di commit, l'elaborazione di
commit continua ad eseguire il
commit del massimo numero di
risorse rimanenti possibile. Il
messaggio CPF8363 viene inviato
alla fine dell'elaborazione di
commit.
Controllo del commit
113
Situazione
Elaborazione di commit o rollback
Azione suggerita
Monitoraggio della generazione di
Malfunzionamento durante il commit v Se l'errore si verifica durante la
del programma di uscita di commit e
fase di preparazione, la transazione messaggi; gestire come desiderato
di rollback o a livello di oggetto per
viene sottoposta a rollback e viene
la risorsa di commit API
inviato il messaggio CPF83DB.
v Se l'errore si verifica durante la
fase di commit, l'elaborazione
continua ad eseguire il commit o il
rollback del massimo numero di
risorse rimanenti possibile. A
seconda del tipo di risorsa di
commit, viene restituito uno dei
seguenti messaggi:
– CPD8353
– CPD8354
– CPD8355
– CPD8361
Il messaggio CPF8363 viene inviato
alla fine dell'elaborazione di
commit.
Il rollback di I/E a livello di record
ha esito negativo
1. Restituisce CPD8356
2. Provare a continuare
l'elaborazione per eseguire il
rollback di risorse di commit API
o a livello di oggetto
Monitoraggio della generazione di
messaggi; gestire come desiderato
3. Restituisce CPF8359 alla fine
dell'elaborazione
Malfunzionamento durante il rollback 1. A seconda del tipo di risorsa di
del programma di uscita di commit e
commit, restituisce uno dei
di rollback o a livello di oggetto per
seguenti messaggi:
le risorse di commit API
v CPD8358
Monitoraggio della generazione di
messaggi; gestire come desiderato
v CPD8359
v CPD835A
v CPD8362
2. Continua l'elaborazione
3. Restituisce CPF8359 alla fine
dell'elaborazione
Elaborazione di commit o rollback durante la terminazione del lavoro
Tutte le situazioni descritte nella tabella precedente sono valide anche durante la terminazione di un
lavoro, tranne per il fatto che viene inviato uno dei seguenti messaggi:
v CPF8356 se sono registrate solo le risorse locali
v CPF835C se sono registrate solo le risorse remote
v CPF83E4 se sono registrate sia le risorse locali sia quelle remote
Inoltre, potrebbe essere visualizzato uno dei due messaggi specifici per il completamento del lavoro se è
stato richiamato un programma di uscita di commit e rollback per una risorsa di cui è possibile eseguire
il commit API. Se il programma di uscita di commit e rollback non viene completato entro 5 minuti viene
annullato; viene inviato un messaggio di diagnostica CPD8363 (per il commit) o CPD8364 (per il rollback)
e il resto dell'elaborazione di commit o di rollback continua.
114
IBM i: Database Controllo del commit
Elaborazione di commit o di rollback durante l'IPL (initial program load)
Tutte le situazioni descritte nella tabella precedente si applicano anche durante il ripristino IPL per le
definizioni di commit, tranne per il fatto che viene inviato il messaggio CPF835F invece del messaggio
CPF8359 o CPF8363. I messaggi inviati per una specifica definizione di commit possono essere presenti
nella registrazione lavoro per uno dei lavori QDBSRVxx o nella registrazione QHST. Nella registrazione
QHST, il messaggio CPI8356 indica l'inizio del ripristino IPL per una specifica definizione di commit. Il
messaggio CPC8351 indica la fine del ripristino IPL per una specifica definizione di commit e qualsiasi
altro messaggio relativo al ripristino di tale definizione di commit si trova tra questi due messaggi.
Potrebbe essere visualizzato uno dei due messaggi specifici per una definizione di commit, se è stato
richiamato un programma di uscita di commit e rollback per una risorsa di cui è possibile eseguire il
commit API. Se il programma di uscita di commit e rollback non viene completato entro 5 minuti viene
annullato; viene inviato un messaggio di diagnostica CPD8363 (per il commit) o CPD8364 (per il rollback)
e il resto dell'elaborazione di commit o di rollback continua.
Rilevazione di condizioni di stallo
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
Attenersi alla seguente procedura per determinare se si è verificata una condizione di stallo e, in caso
affermativo, correggerla:
1. Individuare il lavoro sospeso nell'elenco di lavori attivi.
2. Consultare gli oggetti che il lavoro sta attendendo di bloccare.
3. Per tutti gli oggetti che il lavoro sta attendendo di bloccare, consultare l'elenco di detentori di blocchi
(transazioni o lavori) e provare a trovare un blocco in conflitto che corrisponde al livello richiesto dal
lavoro sospeso.
4. Se una transazione sta detenendo un blocco in conflitto, visualizzare i lavori associati a questa
transazione e verificare se uno di essi sta attendendo di bloccare.
5. Determinare se il lavoro in attesa sta provando a bloccare uno degli oggetti bloccati dal lavoro
sospeso iniziale. Quando si trova il lavoro che sta provando a bloccare uno degli oggetti bloccati dal
lavoro sospeso iniziale, è possibile identificare gli oggetti in questione come possibili cause di
problemi.
6. Esaminare la transazione per determinare l'appropriato corso di azione.
a. Consultare le proprietà della transazione per appurare quale applicazione l'ha iniziata e consultare
quindi il codice applicazione.
b. In alternativa, tracciare le azioni della transazione fino a questo punto trovando l'ID di ciclo di
commit nelle proprietà della transazione e cercando quindi in un giornale le voci che contengono
questo ID. Per eseguire questa operazione, è possibile utilizzare il comando RTVJRNE (Richiamo
voce di giornale) e specificare il parametro CMTCYCID.
c. Dopo aver ottenuto informazioni pertinenti, è possibile scegliere di forzare un'operazione di
rollback o di commit.
Controllo del commit
115
Attività correlate
“Riduzione al minimo dei blocchi” a pagina 74
Un modo tipico per ridurre al minimo i blocchi di record consiste nel rilasciare il blocco di record.
(Questa tecnica non funziona se è stato specificato LCKLVL(*ALL)).
Determining the status of a job
“Visualizzazione di oggetti bloccati per una transazione” a pagina 70
È possibile visualizzare degli oggetti bloccati per le transazioni globali solo con i blocchi nell'ambito della
transazione.
“Visualizzazione di lavori associati a una transazione” a pagina 70
Per visualizzare i lavori associati a una transazione, attenersi alla seguente procedura.
“Visualizzazione delle informazioni sul controllo del commit” a pagina 69
System i Navigator può visualizzare informazioni su tutte le transazioni (unità di lavoro logiche) sul
sistema. System i Navigator può anche visualizzare eventuali informazioni sul lavoro associate a una
transazione.
“Quando forzare le opzioni di commit e di rollback e quando annullare la risincronizzazione” a pagina
117
La decisione di forzare un'operazione di commit o di rollback viene detta decisione euristica. Questa azione
abilita un operatore ad eseguire il commit o il rollback manualmente delle risorse per una transazione che
è in uno stato Preparato.
“Ricerca di transazioni di grandi dimensioni oppure obsolete” a pagina 119
Utilizzare il comando WRKCMTDFN (Gestione definizioni di commit) per trovare transazioni di grandi
dimensioni oppure obsolete.
Riferimenti correlati
Retrieve Journal Entry (RTVJRNE) command
Ripristino delle transazioni dopo un errore nelle comunicazioni
Queste istruzioni aiutano a gestire le transazioni che eseguono delle attività su un sistema remoto dopo
che si è verificato un errore nelle comunicazioni con tale sistema.
Nel caso di un errore nelle comunicazioni, il sistema di norma completa la risincronizzazione con i
sistemi remoti automaticamente. Tuttavia, se l'errore è talmente grave che le comunicazioni con il sistema
remoto non verranno mai ristabilite (ad esempio se la linea di comunicazione viene interrotta), è
necessario annullare la risincronizzazione e ripristinare le transazioni personalmente. Le transazioni
potrebbero anche detenere dei blocchi che devono essere rilasciati.
1. In System i Navigator, visualizzare le informazioni sul controllo del commit per la transazione con cui
si sta lavorando.
2. Trovare la transazione cui si è interessati che sta provando ad eseguire la risincronizzazione con il
sistema remoto. Il campo Risincronizzazione in corso per tale transazione è impostato su sì.
3. Cercare le transazioni che avevano una connessione al sistema remoto controllando lo stato della
risorsa per le singole transazioni.
4. Dopo aver identificato le transazioni, è necessario forzare il commit o il rollback, a seconda dello stato
della transazione.
5. È possibile decidere per l'esecuzione del commit o del rollback dopo aver esaminato le proprietà della
transazione.
v È possibile utilizzare l'ID unità di lavoro per trovare altre parti della transazione su altri sistemi.
v È anche possibile determinare l'esecuzione del commit o del rollback dallo stato della transazione.
Ad esempio, se una transazione del database sta eseguendo un commit in due fasi durante un
errore nelle comunicazioni e il suo stato dopo l'errore è "preparato" o "ultimo agent in sospeso", è
possibile scegliere di forzare il commit sulla transazione.
6. Dopo la forzatura di un commit o un rollback sulle transazioni in dubbio, arrestare la
risincronizzazione sulla connessione in errore per le transazioni identificate.
116
IBM i: Database Controllo del commit
Attività correlate
“Visualizzazione delle informazioni sul controllo del commit” a pagina 69
System i Navigator può visualizzare informazioni su tutte le transazioni (unità di lavoro logiche) sul
sistema. System i Navigator può anche visualizzare eventuali informazioni sul lavoro associate a una
transazione.
“Quando forzare le opzioni di commit e di rollback e quando annullare la risincronizzazione”
La decisione di forzare un'operazione di commit o di rollback viene detta decisione euristica. Questa azione
abilita un operatore ad eseguire il commit o il rollback manualmente delle risorse per una transazione che
è in uno stato Preparato.
Quando forzare le opzioni di commit e di rollback e quando annullare
la risincronizzazione
La decisione di forzare un'operazione di commit o di rollback viene detta decisione euristica. Questa azione
abilita un operatore ad eseguire il commit o il rollback manualmente delle risorse per una transazione che
è in uno stato Preparato.
Quando si prende una decisione euristica, lo stato della transazione diviene euristicamente mista se la
propria decisione non è congruente con i risultati delle altre ubicazioni nella transazione. È necessario
assumersi l'onere di determinare l'azione eseguita da tutte le altre ubicazioni che hanno partecipato alla
transazione e di risincronizzare i record di database.
Prima di prendere una decisione euristica, raccogliere tutte le informazioni possibili sulla transazione.
Visualizzare i lavori associati alla definizione di commit e creare un record che indica i giornali e i file
interessati. È possibile utilizzare queste informazioni successivamente se si devono visualizzare le voci di
giornale e applicare o eliminare modifiche registrate su giornale manualmente.
Un punto ottimale di reperimento di informazioni su una transazione è l'ubicazione che ha iniziato tale
transazione. Tuttavia, la decisione di eseguire il commit o il rollback potrebbe appartenere a una risorsa
API o a un ultimo agent.
Se una risorsa API è stata registrata come una risorsa ultimo agent, la decisione finale di eseguire il
commit o il rollback appartiene alla risorsa API. È necessario verificare le informazioni sull'applicazione e
su come utilizza la risorsa API per determinare se eseguire il commit o il rollback.
Se per la transazione è selezionato un ultimo agent, la decisione di eseguire il commit o il rollback
appartiene all'ultimo agent. Consultare lo stato dell'ultimo agent per informazioni sulla transazione.
Quando è necessario prendere delle decisioni euristiche o annullare la risincronizzazione a causa di un
errore di sistema o nelle comunicazioni che non è possibile riparare, è possibile trovare tutte le
transazioni in dubbio attenendosi alla seguente procedura:
1. In System i Navigator, espandere il sistema che si desidera gestire.
2. Espandere Database e il database locale per il sistema.
3. Espandere Transazioni.
4. Espandere Transazioni database o Transazioni globali.
In queste finestre di visualizzazione, è possibile vedere la definizione di commit, lo stato di
risincronizzazione, l'ID di unità di lavoro corrente e lo stato dell'unità di lavoro corrente per ciascuna
transazione. Cercare le transazioni con le seguenti informazioni:
v Transazioni con uno Stato unità logica di lavoro di Preparato o Ultimo agent in sospeso.
v Transazioni che mostrano uno stato di Risincronizzazione in corso impostato su sì.
Controllo del commit
117
Per gestire il lavoro che sta partecipando nella transazione di questo sistema, fare clic con il tasto destro
del mouse sulla transazione e selezionare lavoro.
Quando si fa clic con il tasto destro del mouse sulla transazione, è anche possibile selezionare Forza
commit, Forza rollback o Annulla risincronizzazione.
Prima di prendere una decisione euristica o di annullare la risincronizzazione, è opportuno controllare lo
stato dei lavori sugli altri sistemi associati alla transazione. Controllare i lavori sui sistemi remoti può
aiutare ad evitare decisioni che causano incongruenze del database tra i sistemi.
1. Fare clic con il tasto destro del mouse sulla transazione che si desidera gestire.
2. Selezionare Stato risorsa.
3. Nella finestra di dialogo Stato risorsa, selezionare la scheda Conversazione per le connessioni SNA;
selezionare Connessione per le connessioni TCP/IP.
Ciascuna risorsa di conversazione rappresenta un sistema remoto che sta partecipando alla transazione.
Sui sistemi remoti, è possibile utilizzare System i Navigator per visualizzare le transazioni associate alla
transazione.
La parte di base dell'ID dell'unità di lavoro è uguale su tutti i sistemi. Quando si visualizzano le
informazioni sul controllo del commit sul sistema remoto, cercare la parte di base dell'ID dell'unità di
lavoro che è uguale sul sistema locale.
Ad esempio, se l'ID dell'unità di lavoro sul sistema locale inizia con: APPN.RCHASL97.X'112233445566,
cercare l'ID dell'unità di lavoro sul sistema remoto che inizia anch'esso con
APPN.RCHASL97.X'112233445566.
Concetti correlati
“Supporto delle transazioni XA per il controllo del commit” a pagina 46
DB2 for i può partecipare nelle transazioni globali X/Open.
“Avvio del controllo del commit” a pagina 52
Per avviare il controllo del commit, utilizzare il comando STRCMTCTL (Avvio controllo commit).
Attività correlate
“Rilevazione di condizioni di stallo” a pagina 115
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
“Ripristino delle transazioni dopo un errore nelle comunicazioni” a pagina 116
Queste istruzioni aiutano a gestire le transazioni che eseguono delle attività su un sistema remoto dopo
che si è verificato un errore nelle comunicazioni con tale sistema.
“Visualizzazione delle informazioni sul controllo del commit” a pagina 69
System i Navigator può visualizzare informazioni su tutte le transazioni (unità di lavoro logiche) sul
sistema. System i Navigator può anche visualizzare eventuali informazioni sul lavoro associate a una
transazione.
Fine di un rollback a lunga esecuzione
È possibile terminare i rollback a lunga esecuzione che consumano tempo del processore critico, bloccano
risorse o utilizzano spazio di memorizzazione.
Un'operazione di rollback elimina tutte le modifiche apportate in una transazione dopo la precedente
operazione di commit o di rollback. Durante un'operazione di rollback, il sistema rilascia anche i blocchi
correlati alla transazione. Se contiene migliaia di transazioni, il sistema impiega ore per completare
un'operazione di rollback. Questi rollback a lunga esecuzione possono consumare tempo del processore
critico, bloccare risorse o utilizzare spazio di memorizzazione.
118
IBM i: Database Controllo del commit
Prima di terminare un rollback a lunga esecuzione, è necessario sapere quali sono le definizioni di
commit di cui si sta eseguendo il rollback e qual è il loro stato. Il campo relativo allo stato per le
definizioni di commit di cui è in corso il rollback è impostato su ROLLBACK IN CORSO.
Utilizzare il comando WRKCMTDFN (Gestione definizioni di commit) per controllare lo stato di un
rollback attenendosi alla seguente procedura:
1. Immettere WRKCMTDFN JOB(*ALL) dall'interfaccia basata sui caratteri.
2. Immettere F11 per visualizzare il campo Stato.
Se si termina un rollback a lunga esecuzione, i file che erano stati modificati durante la transazione
verranno lasciati con delle transazioni parziali. Non si deve terminare un rollback se i file non possono
avere delle transazioni parziali. Per appurare quali sono i file che erano stati modificati durante la
transazione, scegliere l'opzione 5 per visualizzare lo stato dall'elenco WRKCMTDFN. Premere F6 per
visualizzare lo stato della risorsa e selezionare Livello record.
È necessario disporre dell'autorizzazione speciale a tutti gli oggetti (*ALLOBJ) per terminare un rollback a
lunga esecuzione. Per terminare un rollback a lunga esecuzione, attenersi alla seguente procedura:
1. Immettere WRKCMTDFN JOB(*ALL) dall'interfaccia basata sui caratteri.
2. Immettere l'opzione 20 (Fine rollback) sulla definizione di commit che si desidera terminare.
I file con delle transazioni parziali hanno il campo Presenza transazione parziale, rollback terminato
impostato su *YES nell'emissione dal comando DSPFD (Visualizzazione descrizione file). È necessario
rimuovere le transazioni parziali prima che il file possa essere utilizzato. È possibile rimuovere le
transazioni parziali eliminando il file e ripristinandolo da un salvataggio precedente. Se non si dispone di
un salvataggio precedente, è possibile utilizzare il comando CHGJRNOBJ (Modifica oggetto registrato su
giornale) per reimpostare lo stato Presenza transazione parziale in modo da poter aprire il file. L'utilizzo
di CHGJRNOBJ richiede che si modifichi il file per portarlo a uno stato congruente. È necessario
utilizzare il comando CHGJRNOBJ solo se non è disponibile un salvataggio precedente.
Disabilitazione della capacità di terminare un rollback a lunga esecuzione
Gli utenti con l'autorizzazione speciale *ALLOBJ possono terminare i rollback per impostazione
predefinita. Se si desidera impedire agli utenti che hanno l'autorizzazione speciale *ALLOBJ di terminare
i rollback, è possibile farlo creando l'area dati QGPL/QTNNOENDRB.
Riferimenti correlati
Create Data Area (CRTDTAARA) command
|
Ricerca di transazioni di grandi dimensioni oppure obsolete
|
|
Utilizzare il comando WRKCMTDFN (Gestione definizioni di commit) per trovare transazioni di grandi
dimensioni oppure obsolete.
|
|
Per trovare delle transazioni di grandi dimensioni oppure obsolete, attenersi alla seguente procedura:
|
|
|
|
|
|
|
|
|
|
1. Immettere WRKCMTDFN JOB(*ALL) OUTPUT(*PRINT) dall'interfaccia basata sui caratteri.
2. Utilizzare il comando WRKSPLF per gestire i file di spool.
3. Utilizzare l'opzione 5=Visualizz. per visualizzare il file di spool creato dal comando WRKCMTDFN al
passo 1.
4. Per trovare delle transazioni di grandi dimensioni, cercare i campi 'Blocchi record' e 'Modifiche in
sospeso' visualizzati nella sezione Visualizzazione dello stato del giornale per ciascuna definizione di
commit. Questi campi mostrano il numero totale di blocchi di record e di modifiche in sospeso
attualmente per la transazione.
5. Per trovare delle transazioni obsolete, cercare il campo 'Registrazione data/ora' nella sezione Stato
controllo del commit per ciascuna definizione di commit. Questo campo mostra quando è stata
avviata la transazione.
Controllo del commit
119
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Queste informazioni sono visualizzate anche quando si utilizza System i® Navigator o IBM Systems
Director Navigator per i per visualizzare le transazioni, ma è più facile trovare le transazioni di grandi
dimensioni oppure obsolete cercando nel singolo file di spool prodotto dal comando WRKCMTDFN
invece di visualizzare le proprietà e lo stato risorsa per ciascuna transazione.
Attività correlate
“Rilevazione di condizioni di stallo” a pagina 115
Una condizione di stallo può verificarsi quando un lavoro detiene un blocco su un oggetto, l'oggetto A, e
sta attendendo di ottenere un blocco su un altro oggetto, l'oggetto B. Contemporaneamente, un altro
lavoro o un'altra transazione attualmente detiene un blocco sull'oggetto B e sta attendendo di ottenere un
blocco sull'oggetto A.
“Visualizzazione delle informazioni sul controllo del commit” a pagina 69
System i Navigator può visualizzare informazioni su tutte le transazioni (unità di lavoro logiche) sul
sistema. System i Navigator può anche visualizzare eventuali informazioni sul lavoro associate a una
transazione.
Informazioni correlate per il controllo del commit
I manuali dei prodotti, le pubblicazioni IBM Redbooks, i siti Web e altre raccolte di argomenti
dell'information center contengono informazioni correlate alla raccolta di argomenti Controllo del commit.
È possibile visualizzare o stampare qualsiasi file PDF.
Manuali
I seguenti manuali non sono inclusi nell'Information Center i5/OS V6R1. Tuttavia, questi manuali
potrebbero contenere utili informazioni di riferimento. Ciascuno dei manuali è disponibile dal sito IBM
come copia cartacea
Publications Center (www.elink.ibmlink.ibm.com/publications/servlet/pbi.wss?)
stampata che è possibile ordinare, nel formato in linea che è possibile scaricare gratuitamente o in
entrambi i formati.
v COBOL/400 User's Guide
v RPG/400 User's Guide
IBM Redbooks
v Advanced Functions and Administration on DB2 for i
(5529 KB)
v Stored Procedures, Triggers, and User Defined Functions on DB2 for i
v Striving for Optimal Journal Performance on DB2 for i
Siti Web
v The Open Group (www.opengroup.org)
Ulteriori informazioni
v Database programming
v SQL programming
v XA APIs
v Journal management
120
IBM i: Database Controllo del commit
(3174 KB)
(5836 KB)
Riferimenti correlati
“File PDF per il controllo del commit” a pagina 1
È possibile visualizzare e stampare un file PDF che contiene le presenti informazioni.
Informazioni sull'esonero di responsabilità e licenza del codice
IBM fornisce una licenza non esclusiva per utilizzare tutti gli esempi del codice di programmazione da
cui creare funzioni simili personalizzate, in base a richieste specifiche.
OLTRE ALLE GARANZIE STABILITE DALLA LEGGE CHE NON POSSONO ESSERE ESCLUSE, IBM,
GLI SVILUPPATORI DEL PROGRAMMA E I FORNITORI NON OFFRONO GARANZIE O CONDIZIONI
ESPRESSE O IMPLICITE, INCLUSO, MA NON SOLO, LE GARANZIE O CONDIZIONI IMPLICITE DI
COMMERCIABILITA', ADATTABILITA' A UNO SCOPO PARTICOLARE E NON CONTRAFFAZIONE
RELATIVAMENTE AL PROGRAMMA E AL SUPPORTO TECNICO, SE PRESENTE.
IN NESSUN CASO IBM, GLI SVILUPPATORI DEL PROGRAMMA O I FORNITORI SARANNO
RESPONSABILI PER QUANTO SEGUE, ANCHE SE INFORMATI DEL POSSIBILE VERIFICARSI DI
TALI DANNI:
1. PERDITA O DANNEGGIAMENTO DI DATI;
2. DANNI PARTICOLARI, INCIDENTALI, DIRETTI O INDIRETTI O QUALSIASI DANNO
ECONOMICO CONSEGUENTE; OPPURE
3. PERDITE DI PROFITTI, AFFARI, ENTRATE O SPESE ANTICIPATE.
LA LEGISLAZIONE DI ALCUNI PAESI NON CONSENTE L'ESCLUSIONE O LA LIMITAZIONE DELLE
GARANZIE DI DANNI DIRETTI, INCIDENTALI O CONSEQUENZIALI, PERTANTO ALCUNE O
TUTTE LE SUDDETTE ESCLUSIONI O LIMITAZIONI POTREBBERO NON ESSERE APPLICABILI.
Controllo del commit
121
122
IBM i: Database Controllo del commit
Appendice. Informazioni particolari
Queste informazioni sono state sviluppate per prodotti e servizi offerti negli Stati Uniti.
IBM può non offrire i prodotti, i servizi o le funzioni presentati in questo documento in altri paesi.
Contattare il rappresentante IBM locale per informazioni sui prodotti e servizi correntemente disponibili
nella propria area. Qualsiasi riferimento ad un prodotto, programma o servizio IBM non implica o
intende dichiarare che solo quel prodotto, programma o servizio IBM può essere utilizzato. Qualsiasi
prodotto funzionalmente equivalente al prodotto, programma o servizio che non violi alcun diritto di
proprietà intellettuale IBM può essere utilizzato. Tuttavia la valutazione e la verifica dell'uso di prodotti o
servizi non IBM ricadono esclusivamente sotto la responsabilità dell'utente.
IBM può avere brevetti o domande di brevetto in corso relativi a quanto trattato nel presente documento.
La fornitura di questa pubblicazione non garantisce la concessione di alcuna licenza su tali brevetti. Chi
desiderasse ricevere informazioni relative alla licenza può rivolgersi per iscritto a:
IBM Director of Commercial Relations
IBM Europe
Schoenaicher Str. 220
D-7030 Boeblingen
Deutschland
Per informazioni sulle richieste di licenze relative al doppio byte (DBCS), contattare il reparto proprietà
intellettuale IBM nel proprio paese o inviare le richieste per iscritto all'indirizzo:
Intellectual Property Licensing
Legal and Intellectual Property Law
IBM Japan, Ltd.
3-2-12, Roppongi, Minato-ku, Tokyo 106-8711, Japan
Le disposizioni contenute nel seguente paragrafo non si applicano al Regno Unito o ad altri paesi nei
quali tali disposizioni non siano congruenti con le leggi locali: IBM FORNISCE QUESTA
PUBBLICAZIONE “COSÌ COM'È” SENZA ALCUNA GARANZIA, ESPLICITA O IMPLICITA, IVI
INCLUSE EVENTUALI GARANZIE DI COMMERCIABILITÀ ED IDONEITÀ AD UNO SCOPO
PARTICOLARE. Alcuni stati non consentono la rinuncia ad alcune garanzie espresse o implicite in
determinate transazioni, pertanto, la presente dichiarazione può non essere applicabile.
Queste informazioni potrebbero contenere imprecisioni tecniche o errori tipografici. Si effettuano
periodicamente modifiche alle informazioni qui accluse; queste modifiche saranno inserite in nuove
edizioni della pubblicazione. IBM si riserva di apportare senza preavviso e in qualsiasi momento
miglioramenti e/o modifiche al/i prodotto/i e/o al/i programma/i descritto/i in questa pubblicazione.
Qualsiasi riferimento a siti web non IBM, contenuto in queste informazioni, viene fornito solo per
comodità e non implica in alcun modo l'approvazione di tali siti. Le informazioni reperibili nei siti Web
non sono parte integrante delle informazioni relative a questo prodotto IBM, pertanto il loro utilizzo
ricade sotto la responsabilità dell'utente.
IBM può utilizzare o distribuire le informazioni fornite in qualsiasi modo ritenga appropriato senza
obblighi verso l'utente.
I licenziatari di questo programma che desiderano avere informazioni allo scopo di abilitare: (i) lo
scambio di informazioni tra i programmi creati indipendentemente e gli altri programmi (incluso il
presente) e (ii) il reciproco utilizzo di informazioni che sono state scambiate, dovrebbero contattare:
IBM Corporation
© Copyright IBM Corp. 2003, 2010
123
Software Interoperability Coordinator, Department YBWA
3605 Highway 52 N
Rochester, MN 55901
U.S.A.
Tali informazioni possono essere disponibili, in base ad appropriate clausole e condizioni, includendo in
alcuni casi, il pagamento di una tassa.
Il programma su licenza descritto in questa pubblicazione e tutto il relativo materiale disponibile viene
fornito da IBM nei termini dell'accordo IBM Customer Agreement, IBM International Program License
Agreement, IBM License Agreement for Machine Code o qualsiasi altro accordo equivalente tra le parti.
Qualsiasi dato sulle prestazioni contenuto in questa pubblicazione è stato stabilito in un ambiente
controllato. Quindi i risultati ottenuti in altri ambienti operativi potrebbero variare in modo significativo.
È possibile che alcune misurazioni siano state effettuate su sistemi a livello di sviluppo e non esiste
alcuna garanzia che tali misurazioni siano le stesse su sistemi generalmente disponibili. Inoltre, è
possibile che alcune misurazioni siano state calcolate tramite estrapolazione. I risultati effettivi possono
variare. Gli utenti di questa pubblicazione devono verificare che i dati siano applicabili al loro specifico
ambiente.
Le informazioni riguardanti prodotti non IBM sono ottenute dai fornitori di tali prodotti, dai loro annunci
pubblicati o da altre fonti pubblicamente reperibili. IBM non ha testato tali prodotti e non può confermare
l'adeguatezza delle prestazioni, della compatibilità o di altre richieste relative a prodotti non IBM. Le
domande sulle capacità dei prodotti non IBM dovranno essere indirizzate ai fornitori di tali prodotti.
Tutte le specifiche relative alle direttive o intenti futuri di IBM sono soggette a modifiche o a revoche
senza notifica e rappresentano soltanto scopi ed obiettivi.
Queste informazioni contengono esempi di dati e prospetti utilizzati in quotidiane operazioni aziendali.
Per illustrarle nel modo più completo possibile, gli esempi includono i nomi di individui, società, marchi
e prodotti. Tutti questi nomi sono fittizi e qualsiasi somiglianza con nomi ed indirizzi utilizzati da gruppi
aziendali realmente esistenti è puramente casuale.
LICENZA DI COPYRIGHT:
Queste informazioni contengono programmi di applicazione di esempio nella lingua di origine, che
illustrano le tecniche di programmazione su varie piattaforme operative. È possibile copiare, modificare e
distribuire questi programmi di esempio in qualsiasi formato senza pagare alcun corrispettivo a IBM, allo
scopo di sviluppare, utilizzare, commercializzare o distribuire i programmi dell'applicazione conformi
all'interfaccia di programmazione dell'applicazione per la piattaforma operativa per cui i programmi di
esempio vengono scritti. Questi esempi non sono stati interamente testati in tutte le condizioni. IBM,
perciò, non fornisce nessun tipo di garanzia o affidabilità implicita, rispetto alla funzionalità o alle
funzioni di questi programmi. I programmi di esempio vengono forniti "COSI' COME SONO", senza
garanzie di alcun tipo. IBM non intende essere responsabile per alcun danno derivante dall'utilizzo dei
programmi di esempio.
Ogni copia, parte di questi programmi di esempio o lavoro derivato, devono includere un avviso sul
copyright, come ad esempio:
© (nome società) (anno). Le parti di questo codice provengono dai Programmi di esempio di IBM Corp.
© Copyright IBM Corp. _immettere l'anno o gli anni_.
Se si sta utilizzando la versione in formato elettronico di questo manuale, le fotografie e le illustrazioni a
colori potrebbero non essere visualizzate.
124
IBM i: Database Controllo del commit
Informazioni sull'interfaccia di programmazione
Questa pubblicazione di controllo del commit illustra le interfacce di programmazione che consentono al
cliente di scrivere programmi per ottenere i servizi di IBM i.
Marchi
IBM, il logo IBM e ibm.com sono marchi di International Business Machines Corp., registrati in molte
giurisdizioni del mondo. Altri nomi di prodotti e servizi possono essere marchi di IBM o di altre società.
Un elenco attuale di marchi IBM è disponibile su Web nella sezione Copyright and trademark
information al sito www.ibm.com/legal/copytrade.shtml.
I seguenti termini sono marchi di IBM Corporation negli Stati Uniti e/o negli altri paesi:
COBOL/400
DB2
Distributed Relational Database Architecture
DRDA
IBM i
IBM
IBM (logo)
Integrated Language Environment
Redbooks
RPG/400
System i
Adobe, il logo Adobe, PostScript® e il logo PostScript sono marchi di Adobe Systems Incorporated negli
Stati Uniti e/o in altri paesi.
UNIX è un marchio registrato di The Open Group negli Stati Uniti e in altri paesi.
Nomi di altre società, prodotti o servizi possono essere marchi o marchi di servizio di altre società.
Termini e condizioni
Le autorizzazioni per l'utilizzo di queste pubblicazioni vengono concesse in base alle seguenti
disposizioni.
Uso personale: È possibile riprodurre queste pubblicazioni per uso personale, non commerciale a
condizione che vengano conservate tutte le indicazioni relative alla proprietà. Non è possibile distribuire,
visualizzare o produrre lavori derivati di tali pubblicazioni o di qualsiasi loro parte senza chiaro consenso
da parte di IBM.
Uso commerciale: È possibile riprodurre, distribuire e visualizzare queste pubblicazioni unicamente
all'interno del proprio gruppo aziendale a condizione che vengano conservate tutte le indicazioni relative
alla proprietà. Non è possibile effettuare lavori derivati di queste pubblicazioni o riprodurre, distribuire o
visualizzare queste pubblicazioni o qualsiasi loro parte al di fuori del proprio gruppo aziendale senza
chiaro consenso da parte di IBM.
Fatto salvo quanto espressamente concesso in questa autorizzazione, non sono concesse altre
autorizzazioni, licenze o diritti, espressi o impliciti, relativi alle pubblicazioni o a qualsiasi informazione,
dato, software o altra proprietà intellettuale qui contenuta.
IBM si riserva il diritto di ritirare le autorizzazioni qui concesse qualora, a propria discrezione, l'utilizzo
di queste pubblicazioni sia a danno dei propri interessi o, come determinato da IBM, qualora non siano
rispettate in modo appropriato le suddette istruzioni.
Appendice. Informazioni particolari
125
Non è possibile scaricare, esportare o ri-esportare queste informazioni se non pienamente conformi con
tutte le leggi e le norme applicabili, incluse le leggi e le norme di esportazione degli Stati Uniti.
IBM NON RILASCIA ALCUNA GARANZIA RELATIVAMENTE AL CONTENUTO DI QUESTE
PUBBLICAZIONI. LE PUBBLICAZIONI SONO FORNITE "COSI' COME SONO", SENZA ALCUN TIPO
DI GARANZIA, ESPRESSA O IMPLICITA, INCLUSE, A TITOLO ESEMPLIFICATIVO, GARANZIE
IMPLICITE DI COMMERCIABILITA' ED IDONEITA' PER UNO SCOPO PARTICOLARE.
126
IBM i: Database Controllo del commit
Stampato in Italia
Scarica