Gestione delle transazioni Concetto di transazione Una transazione è vista come un'unità logica di elaborazione : per consentire transazioni concorrenti e per garantire la base di dati da malfunzionamenti sono necessari opportuni moduli di gestione. à à Un esempio : PARTI(PAR#,GIACENZA,...) ORDINI(ORD#,FOR#,PAR#,QUANT) vincolo di integrità : per una parte PAR# nella relazione PARTI, il valore GIACENZA deve essere pari alla somma delle quantità QUANT ordinate per quella parte nella relazione ORDINI. Si consideri la sequenza di operazioni per aggiungere un nuovo ordine : ('AZ007','F5','P6',1000) La transazione deve operare un aggiornamento sia della relazione ORDINI sia della relazione PARTI. à Gestione delle transazioni pag.1 Il frammento di programma in ambiente DB2 per la transazione in esame è: à EXEC SQL UNDO; WHENEVER SQLERROR GOTO EXEC SQL INSERT INTO ORDINI(ORD#,FOR#,PAR#,QUANT) VALUES ('AZ007','F5','P6',1000); EXEC SQL UPDATE PARTI SET GIACENZA=GIACENZA+1000 WHERE PAR#='P6'; EXEC SQL COMMIT; GOTO FINISH; UNDO : EXEC SQL ROLLBACK; FINISH : RETURN; Se uno dei due aggiornamenti non venisse eseguito il database si troverebbe in uno stato inconsistente. à Il gestore delle transazioni (transaction manager) deve pertanto garantire che la transazione sia considerata atomica anche se in realtà è composta da più operazioni. à Gestione delle transazioni pag.2 ¨ commit : segnala al transaction manager che la transazione è andata a buon fine e richiede che gli effetti prodotti sul database vengano resi permanenti. ¨ rollback (abort) : segnala che si è verificato qualche problema durante l'esecuzione e che il database può essere in uno stato inconsistente; si devono dunque attivare opportune procedure per annullare gli effetti prodotti e riportare il database in uno stato consistente (UNDO). Per gestire in modo corretto le conseguenze derivanti da una transazione che abortisce, il DBMS gestisce un log dove vengono memorizzati dettagli circa le operazioni di aggiornamento effettuate (in particolare vengono gestiti before values e after values). In generale si definisce before image lo stato del database prima di una modifica e after image lo stato raggiunto dopo aver effettuato la modifica. ¨ Nello stesso modo sono gestiti i comandi SQL che sono set_level: ogni comando interattivo SQL è visto come una transazione. ¨ Gestione delle transazioni pag.3 ¨ Stati di una transazione c omm it eseg uit a r ea d/wr it e t er mi na t a en d t r an sac t io n a t t iv a abo r t fa llit a beg in t r a n sac t io n ¨ a livello sintattico sintassi non standard ANSI standard BEGIN TRANSACTION statement; statement; statement; statement; ......... END TRANSACTION Gestione delle transazioni ......... COMMIT pag.4 a bor t it a Definizioni ¨ Azione: operazione di lettura (r[X]) o scrittura (w[X]) sulla base di dati. ¨ Stato consistente: stato che soddisfa tutti i vincoli di integrità. ¨ Stato corretto: stato consistente e coerente con una situazione ammissibile della realtà. ¨ Transazione: una sequenza di operazioni sulla base di dati e di operazioni in memoria temporanea con le seguenti proprietà: ¨ ¨ ¨ ¨ ¨ atomicità correttezza isolamento serializzabilità persistenza proprieta` ACID (Atomicity Consistency Isolation Durability) Gestione delle transazioni pag.5 ¨ ¨ ¨ ¨ ¨ atomicità: solo le committed transactions fanno transitare la base di dati in un nuovo stato corretto. Le aborted transactions sono trattate dal sistema come se non fossero mai state avviate. correttezza/consistenza: una transazione eseguita isolatamente porta la base di dati da uno stato corretto in un stato corretto. isolamento: le modifiche sulla base di dati fatte da una transazione T sono visibili da altre transazioni solo dopo la terminazione di T. serializzabilità: l'effetto sulla base di dati di esecuzioni concorrenti di più transazioni è equivalente a una esecuzione seriale delle transazioni, cioè ad un'esecuzione in cui le transazioni vengono eseguite una dopo l'altra in un qualche ordine. persistenza: gli effetti sulla base di dati prodotti da una transazione terminata con successo sono permanenti, ovvero non sono alterati da eventuali malfunzionamenti. Gestione delle transazioni pag.6 Modello di un DBMS Si considerano per una transazione Ti soltanto le seguenti operazioni : à ri[x] : legge dalla base di dati un dato x e copia il valore in una variabile di programma che per semplicità ha lo stesso nome x. wi[x] : copia il contenuto di una variabile x di programma nella base di dati. ci : commit. ai : abort (rollback) Eventi per una operazione di lettura (scrittura) 1 DBMS Pr ogr am ma Sta to Ar ea di la vor o 2 6 Sc h ema E ster no 3 Sc hem a L ogic o 5 Sistem a Oper ativo Sc hema F isic o 4 B uffer Gestione delle transazioni B a se di dati pag.7 Esecuzione di una istruzione di lettura r[x] 1. il programma chiede al sistema di leggere il dato x; 2. il DBMS consulta lo schema esterno, lo schema logico e quello fisico per reperire il dato; 3. il DBMS chiede al sistema operativo di trasferire la pagina che contiene il dato x; 4. il sistema operativo copia la pagina dati nel buffer, se non e’ gia’ presente; 5. il DBMS copia il dato x dal buffer nella variabile x secondo la struttura definita nello schema esterno; 6. Il DBMS comunica al programma l’informazione sullo stato dell’operazione. Gestione delle transazioni pag.8 Esecuzione di una istruzione di scrittura w[x] 1. il programma chiede al sistema di scrivere il dato x; 2. il DBMS consulta lo schema esterno, lo schema logico e quello fisico per individuare il dato; 3. il DBMS chiede al sistema operativo di trasferire la pagina che dovra’ contenere il dato x; 4. il sistema operativo copia la pagina dati nel buffer, se non e’ gia’ presente; 5. il DBMS copia il valore del dato x nella pagina del buffer secondo la struttura definita nello schema logico e poi chiede al sistema operativo di copiare nella memoria permanente la pagina modificata nel buffer. Questa operazione puo’ essere eseguita immediatamente o differita. 6. il DBMS comunica al programma l’informazione sullo stato dell’operazione. Gestione delle transazioni pag.9 Malfunzionamenti à Si distinguono tre tipi di anomalie di funzionamento: ¨ transaction abort interruzione di una transazione che non comporta perdita di dati in memoria temporanea o permanente. Puo' essere causata da una situazione prevista dal programma (esempio : violazione vincoli di integrità, tentativo di accesso a dati protetti) o rilevata dal gestore (deadlock). ¨ system abort interruzione di transazioni attive derivante da un'anomalia hardware o software dell'unità centrale o di una periferica (un esempio tipico è l'interruzione dell'alimentazione elettrica). Si assume che il contenuto della memoria permanente sopravviva, mentre si considera perso il contenuto della memoria temporanea. Gestione delle transazioni pag.10 ¨ system crash anomalia che danneggia la memoria permanente (esempi : errori umani, rottura di dischi). à Si assume che un malfunzionamento sia sempre rilevato da parte del DBMS e che comporti: ¨ l'interruzione istantanea di una o più transazioni o dell'intero sistema a seconda del tipo di anomalia riscontrata; ¨ l'attivazione di procedure di recovery atte a ripristinare la base di dati in uno stato corretto. Tipo di anomalia transaction abort system abort Frequenza system crash alcuni all'anno Gestione delle transazioni alcuni al minuto alcuni al mese pag.11 Tempo di ripristino millisecondi secondi minuti Quando un database è condiviso fra più utenti l'interferenza tra le transazioni concorrenti può provocare inconsistenze. à In assenza di un gestore, dedicato al controllo della concorrenza e alla schedulazione corretta delle operazioni, possono insorgere problemi che rientrano essenzialmente nelle seguenti tre categorie: à ÷ Lost Update Problem : perdita di modifiche da parte di una transazione a causa di un aggiornamento effettuato da un'altra; Ö Uncommitted Dependency Problem : dipendenza di una transazione da un'altra non completata con successo; Ö Inconsistency Analysis Problem : analisi inconsistente di dati da parte di una transazione causata da aggiornamenti prodotti da un'altra. Gestione delle transazioni pag.12 à Lost Update Problem Transaction A read R Time t1 t2 update R commit Transaction B read R t3 t4 update R commit La transazione A perde al tempo t4 l'aggiornamento effettuato al tempo t3, visto che B modifica nuovamente il valore senza sapere che quello osservato al tempo t2 non è più valido al tempo t4. à Gestione delle transazioni pag.13 à Uncommitted Dependency Problem (dirty read) Accade quando viene concesso a una transazione di accedere a un dato (e peggio ancora modificarne il valore) che è stato aggiornato da un'altra transazione non ancora completata con successo. Transaction A Time Transaction B t0 t1 read R update R t2 t3 rollback La transazione A vede un valore di R al tempo t2, valore che non esiste di fatto in quanto verrà sostituito al tempo t3 con il valore che era valido al tempo t0. à Si noti che il rollback da parte di B può essere dovuto ad una caduta del sistema : ciò implica che alla ripartenza, se A era stata completata con successo, il rollback interesserà solo B e non A. Gestione delle transazioni pag.14 Un altro esempio di questo tipo con conseguenze più gravi: à Transaction A Time Transaction B t0 t1 update R update R t2 t3 rollback Non solo la transazione A dipende dall'insuccesso della transazione B ma perde anche le modifiche fatte al tempo t2 a causa del rollback che interesserà B al tempo t3. à Si tratta dunque di un'altra versione del lost update problem. à Gestione delle transazioni pag.15 à Inconsistent Analysis Problem Si consideri il caso in cui due transazioni A e B operino su record relativi a conti bancari. A vuole sommare gli importi dei vari conti di un cliente, mentre B vuole trasferire un importo di 1000 $ dal conto ACC3 al conto ACC1. ACC1=4000 $ Transaction A read ACC1 ACC2=5000 $ Time ACC3=3000 $ Transaction B t1 sum = 4000 read ACC2 t2 sum = 9000 t3 read ACC3 t4 update ACC3 3000-->2000 read ACC1 t5 t6 update ACC1 4000-->5000 commit t7 read ACC3 t8 sum = 11000 Gestione delle transazioni pag.16 La transazione A opera un'analisi inconsistente dei dati e fornisce come risultato 11000 $ in luogo di 12000 $. à Se questo dato fosse memorizzato in modo permanente nel database verrebbe violato il vincolo che la somma dei conti deve restare costante in caso di trasferimento di denaro da un conto all'altro dello stesso cliente. In questo caso non si tratta di una dipendenza di A da un insuccesso di B, in quanto quest'ultima ha eseguito commit con successo. à à ¥ ¥ ¥ Gli esempi visti suggeriscono : fondamentale per ogni processo di aggiornamento è il concetto di transazione come unità logica di elaborazione, che deve poter essere annullata se necessario per ripristinare il database in uno stato consistente; la gestione delle transazioni non può essere affidata direttamente dell'utente; le transazioni variano in termini di complessità, frequenza di esecuzione e criticità, tuttavia in ogni caso devono essere viste come atomiche. Gestione delle transazioni pag.17 Modello per la gestione delle transazioni T1 Tn T 2 Tr ansac tion Man a ger Sc hed uler Rest a r t Da t a Ma na ger Rec over y Ma nager B uffe r Ma na ge r St a ble Stor age DB DB c opy Vola tile Stor age DB B uffer page Log B u ffer Log Gestione delle transazioni pag.18 ¨ Transaction Manager Controlla l'esecuzione delle transazioni ricevendo le richieste di begin transaction, end transaction, le richieste di accesso ai dati, i comandi commit e abort. Le richieste vengono poi inoltrate allo scheduler. In un sistema distribuito il Transaction Manager è anche responsabile di decidere in quali siti si deve procedere all'esecuzione. ¨ Scheduler Garantisce che l'esecuzione concorrente delle transazioni sia equivalente a una esecuzione seriale delle stesse e sia ripristinabile (recoverability). Ciò implica restringere l'ordine in cui il Data Manager può eseguire read, write, commit e abort delle transazioni. Dopo aver ricevuto una richiesta lo Scheduler prende una delle seguenti decisioni: execute passa il controllo al Data Manager che esegue l'operazione e informa lo Scheduler dello stato raggiunto; in caso di read il valore viene passato allo Scheduler che a sua volta lo restituisce alla transazione; ¨ Gestione delle transazioni pag.19 reject la richesta viene rifiutata e comporta un abort per la transazione che verrà gestito dal Transaction Manager; ¨ delay la richesta viene accodata. ¨ Si consideri come esempio l'esecuzione concorrente di due transazioni di deposito di una somma su un medesimo conto corrente Acc: à Transaction A read Acc Time t1 t2 read Acc t3 update Acc t4 commit update Acc t5 commit t6 Gestione delle transazioni Transaction B pag.20 à Per evitare questa esecuzione non corretta lo scheduler può : a) impedire alla transazione A di eseguire l'operazione update, facendola dunque fallire; in questo caso l'utente potrà riprovare in un altro momento senza interferire con B. b) impedire alla transazione B di eseguire l'update, facendo abortire B. c) ritardare la richiesta read di B fino al completamento di A. d) ritardare sia l'update di A sia l'update di B causando un deadlock, e poi decidere alla rilevazione della situazione di stallo quale delle due transazioni far fallire. Gestione delle transazioni pag.21 ¨ Data Manager E' il modulo del sistema che esegue le operazioni trasmesse dallo scheduler e dal comando restart generato dal sistema operativo dopo un fallimento del sistema, garantendo che la base di dati contenga solo gli effetti delle transazioni terminate normalmente. Dopo ogni operazione eseguita dal Data Manager, e' previsto che invii allo scheduler un segnale di fine operazione (aknowledgment). Inoltre se l' operazione e' di read, restituisce il valore richiesto che viene poi traferito alla transazione. La memoria e' divisa in permanente e temporanea (buffer). Il dato trasferito fra il buffer e la memoria permanente e' di solito una pagina data, mentre il record manager scambia di solito con il resto del sistema un record. Infine il data manager prevede un modulo per il ripristino dei malfunzionamenti (recovery manager) che fa uso di algoritmi basati su UNDO e REDO. Gestione delle transazioni pag.22 ¨ Buffer Manager Si occupa della gestione di buffer di memoria volatile; opera in concomitanza con il Recovery Manager. Fa uso di opportune tecniche per gestire in modo efficiente la condivisione dei buffer da parte di più transazioni concorrenti. ¨ Tecniche di Recovery e Recovery Manager Def: Il recovery e' l'operazione che riporta la base di dati ad un precedente stato corretto dopo che un malfunzionamento ne ha reso incerto lo stato attuale. Il Recovery Manager garantisce che il database memorizzi in modo persistente solo gli effetti prodotti dalle transazioni che hanno eseguito con successo l'operazione commit. Deve dunque fornire supporto per le operazioni di start, commit, abort, read e write. Il Recovery Manager provvede al ripristino del database in caso di malfunzionamenti: in caso di caduta di sistema si occupa di annullare gli effetti prodotti da transazioni ancora attive al momento del guasto. Al fine di garantire un grado di resilienza accettabile in caso di guasti ai dispositivi di memoria di massa (media failures) il Recovery Manager mantiene copia aggiornata del database o di porzioni di esso. Il Recovery Manager usa i log file e copie di backup dei dati (database dump) per fornire la duplicazione dei dati necessaria all'attivita' di recovery. Gestione delle transazioni pag.23 ¨ Data Base Dump (periodico) 1. rifiuta attivazione nuove transazioni 2. attende completamento transazioni attive 3. forza la scrittura nelle basi di dati stabili e nel log file delle pagine ancora presenti nella memoria temporanea 4. scrive la marca DUMP sul log 5. fa una copia della base di dati Gestione delle transazioni pag.24 ¨ Uso del Log file Durante l'uso della base di dati, il sistema registra nel log la storia delle azioni effettuate dal momento in cui di essa e' stata fatta l'ultima copia (dump). Il log memorizza entita' logiche (tuple e attributi); entita' fisiche cioe' pagine dati; cambiamenti di stato : vecchi valori di dati, nuovi valori di dati o operazioni (transazioni e parametri). E' un file sequenziale di sistema che contiene la before image e la after image delle pagine modificate in ordine di tempo, marcate con gli identificatori delle transazioni che le hanno modificate e contenenti i record dei begin transaction, commit e abort. Before image = pagina dati prima di una operazione di update. After image = pagina dati dopo una operazione di update. Solitamente e' memorizzato in un'area separata di disco rispetto ai dati. Per maggiore sicurezza normalmente ce sono due o tre copie. Gestione delle transazioni pag.25 Problema : un sistema reale puo' generare 200 milioni di bytes di log data al giorno e quindi non puo' essere tenuto tutto in linea. Per questo solitamente si ha un active log ed il Log Manager fa il dump del log su nastro quando il log e' pieno. à una pagina di log è trasferita dal buffer alla memoria secondaria solo quando è completamente piena, cio' comporta che gli algoritmi di gestione delle transazioni debbano forzare alcune volte la scrittura delle pagine di log sulla memoria secondaria. à Una ulteriore informazione memorizzata nel log e' il cosiddetto checkpoint record (record di allineamento). Il checkchpoint e' un allineamento del log ad uno stato corretto della base di dati relativamente ad un punto di allineamento (synchpoint). Il synchpoint puo' essere attivato ad intervalli fissati di tempo o dopo che sono state scritte un certo numero di registrazioni sul log oppure dietro esplicita richiesta dell'operatore. à Possibile compressione del Log: vengono eliminati i log record delle transazioni che hanno fatto rollback e di quelli che hanno fatto commit al (punto di allineamento). Gestione delle transazioni pag.26 Recovery = redundancy 1. una volta al giorno l'intero database viene dumped (tipicamente su nastro) 2. tutte le volte che viene fatta una modifica di un record nel database, sul file di log viene scritto un record con il vecchio valore ed il nuovo valore In caso di guasto: à Se il guasto e' sul disco viene ripristinato il database dal DUMP e viene usati il file di log per rifare (REDO) tutte le modifiche fatte fino al momento del guasto; à Se (caso piu' fortunato) e' una singola transazione che e' terminata in modo anomalo (senza raggiungere il COMMIT) il database e' riportato ad uno stato corretto precedente la transazione usando il log per disfare (UNDO) le modifiche eventualmente non completate dalla transazione. à Spesso il database (DUPLEXING) Gestione delle transazioni e' pag.27 duplicato su disco System checkpoints Per ridurre la dimensione dei dati da ripristinare dopo un malfunzionamento, quando si raggiunge il synchpoint vengono effettuate alcune azioni per garantire il ripristino: viene memorizzato nel log il checkpoint record (CKP) contenente la lista di tutte le transazioni attive in quell'istante e viene effettuata la scrittura forzata dei buffer di log e del database, cioe' il trasferimento in memoria secondaria del contenuto dei buffer (anche se non sono pieni). La lista delle azioni per garantire il ripristino e' la seguente: Passo 1: forza la scrittura del log buffer; Passo 2: scrive sul log il checkpoint record; Passo 3: forza la scrittura dei buffer di Passo4: scrive l' indirizzo del checkpoint nel log file su restart file. database; record I passi 1 e 2 sono fatti in base al protocollo write-ahead log, cioe' prima di poter fare una modifica nel database va scritto il valore del vecchio dato sul log file, per potere effettuare l'undo se richiesto. Il passo 3 serve per non dover rifare il lavoro che e' gia' stato fatto prima del synchpoint. Gestione delle transazioni pag.28 Restart procedure: procedure di sistema eseguite al tempo di restart per ricostruire il piu' recente stato consistente di un database. Sono basate sul log, su backup di linea ed eventualmente su nastri. à al tempo di restart il Recovery Manager ottiene dal file di restart l' indirizzo del piu' recente checkpoint record e poi scandisce il file di log per cercare le transazione che devono essere disfatte (undo) e quello che devono essere rifatte (redo): à viene fatto UNDO delle transazioni che non hanno raggiunto il commit prima del fallimento; à viene fatto REDO delle transazioni che hanno raggiunto il commit dopo il synchpoint perche' non e' garantito che gli update siano su memoria secondaria. Gestione delle transazioni pag.29 Ripresa da malfunzionamenti à fallimenti di transazioni si scrive sul log (T, abort) e si fa della transazione T à UNDO fallimenti di sistema si attiva restart che: • riporta la base di dati allo stato corretto esistente prima del malfunzionamento; • segnala al gestore delle transazioni fallimento di alcune transazioni; il • riprende il funzionamento del sistema à fallimenti hardware • di dati; si carica la dump più recente della • si ricostruisce la copia corretta più dei dati usando il Gestione delle transazioni pag.30 base recente log. Esempio di ripristino dopo fallimento di sistema t1 t2 t3 t4 t5 S1 S0 S2 S0 Stato iniziale S1 Stato al punto di allineamento S2 Stato al tempo di malfunzionamento S3 Stato in assenza di malfunzionamento S3 à Le transazioni t3 e t5 devono essere disfatte, perche' scandendo il log a partire dal checkpoint record (CKP, {t2,t3}) non si trovano le registrazioni (t3,commit) e (t5,commit). à t2 e t4 devono essere rifatte qualora si adotti il commit anticipato (cio' si scrive commit prima di forzare la scruttura). La transazioni t1 va ignorata perche' le modifiche da essa apportate sono state rese presistenti al tempo S1. Gestione delle transazioni pag.31 Come DB2 risolve i 3 problemi di concorrenza DB2 utilizza la tecnica del locking • granularità del locking tipica è un record del database (fisicamente il locking è sulla pagina) • due tipi di lock: • operazioni a livello di record • una transazione in richiesta di lock aspetta. Se raggiunge un tempo di attesa massimo fallisce. X S — S (Shared) e X (eXclusive) X N N Y S N Y Y — Y Y Y matrice (X, S) di compatibilità dei tipi di lock N indica conflitto Y indica compatibiltà Gestione delle transazioni pag.32 • le richieste di lock sono sempre implicite: se una transazione fa un update acquisisce automaticamente un X lock • tutti i lock sono mantenuti fino al prossimo synchpoint che è stabilito ad inizio programma, commit e rollback LOST UPDATE PROBLEM transaction A — — FETCH R (acquire S lock on R) — — — — UPDATE R (request X lock on R) wait wait wait wait wait wait time transaction B — — — — — FETCH R (acquire S lock on R) — — — — UPDATE R (request X lock on R) wait wait wait t1 t2 t3 t4 non si perde nessuna modifica, ma si verifica DEADLOCK al tempo t4 UNCOMMITTED DEPENDENCY PROBLEM Gestione delle transazioni pag.33 transaction A — — — — — FETCH R (request S lock on R) wait wait wait resume: FETCH R (acquire S lock on R) — time transaction B — — UPDATE R (acquire X lock on R) — — — — synchpoint (release X lock on R) t1 t2 t3 t4 Alla transazione A viene impedito di vedere il record cambiato al tempo t2 fino a quando B non fa commit o rollback (t3 ) Gestione delle transazioni pag.34 UNCOMMITTED DEPENDENCY PROBLEM transaction A — — — — — UPDATE R (request X lock on R) wait wait wait resume: UPDATE R (acquire X lock on R) — time transaction B — — UPDATE R (acquire X lock on R) — — — — synchpoint (release X lock on R) t1 t2 t3 t4 Alla transazione A viene impedito di fare un update fino a quando B non ha raggiunto un synchpoint (t3) Gestione delle transazioni pag.35 The inconsistent analysis problem ACC1=4000 $ ACC2=5000 $ Transaction A Time FETCH ACC1(4000) (acquire S lock on ACC1) :sum = 4000 t1 FETCH ACC1(5000) (acquire S lock on ACC2) :sum = 9000 t2 Transaction B t3 FETCH ACC3(3000) (acquire S lock on ACC3) : t4 update ACC3 3000-->2000 (acquire X lock on ACC3): 3000 - > 2000 FETCH ACC1(3000) (acquire S lock on ACC1) : t5 t6 fetch ACC1 (request S lock on ACC3): wait wait ACC3=3000 $ t7 update ACC1 4000-->5000 (request X lock on ACC1): wait wait wait wait wait wait L'inconsistenza è impedita, ma il deadlock si verifica al tempo t7 Gestione delle transazioni pag.36 In generale ogni operazione che richiede lock può ricevere di ritorno un codice di errore che indica che si è verificato deadlock e che la transazione è stata scelta come vittima. à DEADLOCK transaction A — — LOCK R1 IN X MODE — — — LOCK R2 IN X MODE wait wait wait wait time t1 t2 t3 t4 transaction B — — — — LOCK R2 IN X MODE — — — LOCK R1 IN X MODE wait wait Un esempio di deadlock EXEC SQL ... IF SQLCODE = value indicating "deadlock victim" then DO ; EXEC SQL ROLLBACK; reinitialize variables from initial input data; GO TO beginning of program; END; Gestione delle transazioni pag.37 Transazioni distribuite Def: Una transazione e' distribuita quando e' costituita da sottotransazioni eseguite concorrentemente da processi diversi. Nel caso di DBMS distribuiti le sottotransazioni sono eseguite su nodi diversi di una rete. Il frammento di programma riportato descrive una transazione per trasferimento di fondi, nell' ipotesi che le due relazioni ContiCorrenti(Numero,Saldo) ContiRisparmi(Numero,Saldo) siano memorizzate in due nodi diversi della rete e che la transazione inizi nel nodo dove si trova la relazioneContiRisparmi. La transazione distribuita viene eseguita come due processi che si scambiano messaggi. Process Coordinatore; var EXEC SQL begin declare section Ammontare, xSaldo: integer; Numero,DaConto,AConto: array[1..6] of char; EXEC SQL end declare section begin transaction begin writeln('Scrivi Ammontare, Da quale conto, A quale conto'); read (Ammontare, DaConto, AConto); EXEC SQL Gestione delle transazioni pag.38 Select Saldo into :xSaldo from ContiRisparmi where Numero = :DaConto if xSaldo < Ammontare then begin writeln('Saldo Insufficiente); ABORT; end end; else begin EXEC SQL UPDATE ContiRisparmi set Saldo=:xSaldo:Ammontare where Numero = :DaConto; create Partecipante; send (Ammontare, AConto); COMMIT; end; end transaction; end Coordinatore; Process Partecipante; var EXEC SQL begin declare section Ammontare, xSaldo:integer; AConto: array[1..6] of char; EXEC SQL end declare section begin Gestione delle transazioni pag.39 receive (Ammontare, AConto) from Coordinatore; EXEC SQL UPDATE ContiCorrenti set Saldo = :xSaldo + :Ammontare where Numero = :AConto; if sqlcode = 0 then commit else abort end Partecipante Gestione delle transazioni pag.40 Transazioni distribuite Protocollo two-phase commit La terminazione di una transazione distribuita T avviene in due fasi: • tutte le sottotransazioni Ti prendono una decisione comune sul modo di terminare • vengono eseguite le operazioni corrispondenti alla decisione presa. coordinatore: a) prepara "precommit" sul log b) fissa un tempo max di attesa c) invia un messaggio "preparati" a tutti i partecipanti d) • se scade il tempo max senza avere ricevuto pronto da tutte le transazioni, registra abort sul log e invia il messaggio "abort" a tutti i partecipanti; Gestione delle transazioni pag.41 • e) se ha ricevuto commit da tutte in tempo utile registra commit sul log e invia il messaggio "commit" a tutti i partecipanti se riceve eseguito da tutti i partecipanti registra end commit sul log. Sottotransazione partecipante a) esegue le operazioni e rimane in attesa del messaggio "preparati" b) quando riceve "preparati" se può terminare registra sul log "pronto" e invia tale messaggio al coordinatore. Se non può terminare registra sul log "non pronto" e invia al coordinatore tale messaggio (fase di precommit) c) quando riceve dal coordinatore il messaggio "commit" o "abort" registra sul log il messaggio, esegue il comando e invia al coordinatore il messaggio "eseguito" (fase di commit) Fallimenti Fallimento nodo partecipante P a) prima di precommit Gestione delle transazioni ® pag.42 abort globale b) dopo precommit C e decisione ® richiesta al coordinatore coordinatore C a) fallisce tra precommit e commit. La procedura di ripristino riavvia il protocollo dall'inizio b) fallisce dopo aver registrato "commit" o "abort" e prima di "end commit" invia di nuovo il messaggio Gestione delle transazioni pag.43