GESTIONE DELLE TRANSAZIONI Transazioni ! L’esecuzione concorrente dei programmi utente è essenziale per le buone prestazioni del DBMS ! ! ! Poiché gli accessi al disco sono frequenti e relativamente lenti, è importante mantenere la CPU impegnata lavorando su diversi programmi utente concorrenti. Il programma di un utente può eseguire molte operazioni sui dati letti dalla base di dati, ma al DBMS interessa solo quali dati sono letti/scritti dalla/sulla base di dati Una transazione è la visione astratta del DBMS di un programma utente ! una sequenza di letture e scritture. Giorgio Giacinto 2010 Database 2 Concorrenza in un DBMS ! Quando gli utenti iniziano una transazione devono pensarla come se fosse l’unica operazione eseguita dal DBMS ! ! La concorrenza viene ottenuta dal DBMS, che alterna le azioni (letture/scritture) di varie transazioni Ciascuna transazione deve lasciare la base di dati in uno stato coerente con i vincoli di integrità, se il DB era coerente all’inizio della transazione ! Il DBMS garantirà il rispetto dei VI dichiarati nei comandi CREATE TABLE, nelle Asserzioni, ecc. Giorgio Giacinto 2010 Database 3 Atomicità delle transazioni ! ! Una transazione può terminare con successo dopo il completamento di tutte le sue azioni, oppure può abortire (o essere abortita dal DBMS) dopo l’esecuzione di alcune azioni Una proprietà molto importante garantita dal DBMS per tutte le transazioni è che esse sono atomiche. ! ! Un utente può pensare a una transazione come se ! o tutte le sue azioni sono eseguite in un solo passo, ! oppure non ne viene eseguita alcuna. Il DBMS registra tutte le azioni così da poter annullare le azioni delle transazioni abortite Giorgio Giacinto 2010 Database 4 Le proprietà ACID ! Un DBMS deve assicurare quattro proprietà delle transazioni ! Atomicità Consistenza Isolamento Durabilità ! ! ! Giorgio Giacinto 2010 Database 5 Esempio ! Consideriamo due transazioni T1: BEGIN T2: BEGIN • • A=A+100, A=1.06*A, B=B-100 B=1.06*B END END Intuitivamente, la prima transazione trasferisce 100$ dal conto di B al conto di A. La seconda accredita su entrambi i conti un pagamento di interessi del 6% Non c’è garanzia che T1 venga eseguita prima di T2 o viceversa, se entrambe sono lanciate insieme. Però l’effetto netto deve essere equivalente a quello delle due transazioni eseguite serialmente in qualche ordine Giorgio Giacinto 2010 Database 6 Esempio (segue) ! Consideriamo una possibile alternanza (schedule) T1: T2: ! A=A+100, A=1.06*A, B=1.06*B Questa va bene. Ma che possiamo dire di T1: T2: ! B=B-100 A=A+100, B=B-100 A=1.06*A, B=1.06*B Il DBMS vede il secondo schedule come T1: T2: R(A), W(A), R(A), W(A), R(B), W(B) Giorgio Giacinto 2010 R(B), W(B) Database 7 Scheduling di transazioni ! Scheduling seriale ! ! Schedule equivalenti ! ! per ogni stato della base di dati, l’effetto (sull’insieme di oggetti nella base di dati) dell’esecuzione del primo schedule è identico all’effetto dell’esecuzione del secondo schedule Schedule serializzabile ! ! schedule che non alterna le azioni di transazioni differenti uno schedule che è equivalente a qualche esecuzione seriale delle transazioni Nota: se ogni transazione conserva la coerenza, ogni schedule serializzabile conserva la coerenza Giorgio Giacinto 2010 Database 8 Possibili anomalie dell’esecuzione concorrente ! Conflitti WR - “letture sporche” ! Lettura di dati non completati T1: T2: ! R(A), W(A), R(B), W(B), Abort R(A), W(A), Commit Conflitti RW ! Letture non ripetibili T1: T2: R(A), W(A), Commit R(A), W(A), Commit Giorgio Giacinto 2010 Database 9 Possibili anomalie dell’esecuzione concorrente ! Conflitti WW ! Sovrascrittura di dati non completati T1: T2: Giorgio Giacinto 2010 W(A), W(B), C W(A), W(B), C Database 10 Protocollo Strict 2PL Controllo di concorrenza mediante lock ! Ciascuna transazione deve ottenere ! ! ! Tutti i lock mantenuti da una transazione sono rilasciati quando la transazione termina ! ! ! un lock C (condiviso) su un oggetto prima di leggere un lock E (esclusivo) su un oggetto prima di scrivere Variante non-strict 2PL ! i lock vengono rilasciati in qualunque momento, ma non si possono acquisire lock dopo aver rilasciato dei lock Se una transazione ottiene un lock E su un oggetto, nessuna altra transazione può ottenere un lock (C o E) su quell’oggetto 2PL consente solo schedule serializzabili Giorgio Giacinto 2010 Database 11 Abortire una transazione ! Se una transazione Ti viene abortita, tutte le sue azioni devono essere annullate. ! ! ! Inoltre, se Tj legge un oggetto che è stato recentemente scritto da Ti, anche Tj deve essere abortita. La maggior parte dei sistemi evitano questo effetto in cascata rilasciando i lock di una transazione solo al momento del completamento ! Se Ti scrive un oggetto, Tj può leggerlo solo dopo che Ti sia terminata con successo Per annullare le azioni di una transazione abortita, il DBMS mantiene un log in cui viene registrata ogni scrittura. ! Meccanismo usato anche per il ripristino dopo un crash Giorgio Giacinto 2010 Database 12 Il log ! Il log registra le seguenti azioni ! ! ! ! ! ! Quando Ti scrive un oggetto si registra il vecchio e il nuovo valore Quando Ti termina o viene abortita Il record del log deve essere registrato sul disco prima della pagina modificata I record del log sono collegati tra loro dall’id della transazione, così che sia facile annullare una transazione specifica Il log è spesso duplicato e archiviato su dispositivi di memoria stabili Tutte le attività legate alla concorrenza sono gestite dal DBMS in maniera trasparente Giorgio Giacinto 2010 Database 13 Recupero dopo un crash ! Ci sono 3 fasi nell’algoritmo di recupero Aries ! ! ! Analisi: scandisce il log in avanti (a partire dal più recente checkpoint) per identificare tutte le transazioni che erano attive, e tutte le pagine modificate nel buffer pool al momento del crash Riesecuzione: riesegue tutti gli aggiornamenti sulle pagine modificate nel buffer pool per assicurare che tutti gli aggiornamenti registrati nel log siano di fatto eseguiti e scritti su disco Annullamento: le scritture di tutte le transazioni che erano attive al momento del crash sono annullate ! Viene ripristinato il valore precedente l’aggiornamento ! Gli annullamenti si eseguono scandendo il log all’indietro ! Precauzioni in caso di crash durante il ripristino Giorgio Giacinto 2010 Database 14