BENEDETTI ALESSANDRO Matricola :252805 PROGETTO DI TECNOLOGIA DELLE BASI DI DATI PARTE 2



Documenti analoghi
Esecuzione concorrente di transazioni

Informatica Generale Andrea Corradini Sistemi di Gestione delle Basi di Dati

Transazioni - Parte 1

2. LOGIN E RECUPERO DATI DI ACCESSO

Pag. 1. Gestione delle transazioni. Linguaggio SQL: costrutti avanzati. Esempio applicativo. Gestione delle transazioni. Prelievo. Esempio applicativo

Gestione delle transazioni. Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke 1

Linguaggio SQL: costrutti avanzati

Transazioni in SQL. Nicola Vitacolonna Corso di Basi di Dati Università degli Studi di Udine 4 dicembre 2013

Transazioni. Capitolo 13. Scrittura immediata e scrittura differita. Concorrenza in un DBMS. Una transazione. Gestione delle transazioni

Azioni. Select e join non consentono di modificare il contenuto del DB. Inserzione di nuovi dati. Azioni desiderate. Aggiornamento di dati

Data Base Management System. Strumenti: Formato: Pro: Contro: Software specifico. Proprietario

Il linguaggio SQL: trigger. Versione elettronica: 04.7.SQL.trigger.pdf

Il linguaggio SQL: transazioni

APPENDICE. Procedure in SQL (1)

Mac Application Manager 1.3 (SOLO PER TIGER)

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Tecnologia di un Database Server (centralizzato) Introduzione generale

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

L architettura di un DBMS

Coordinazione Distribuita

4 3 4 = 4 x x x 10 0 aaa

Tratti dal cap. 9 di: Atzeni, Ceri, Paraboschi, Torlone Basi di Dati II edizione, 1999, McGraw-Hill

CONCETTO DI ANNIDAMENTO

ARCHIVI E DATABASE (prof. Ivaldi Giuliano)

Convertitori numerici in Excel

Dispense di Informatica per l ITG Valadier

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

SISTEMI INFORMATIVI AVANZATI -2010/ Introduzione

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

Sviluppata da: Lo Russo - Porcelli Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL.

Soluzione dell esercizio del 12 Febbraio 2004

Le query di raggruppamento

Introduzione. Coordinazione Distribuita. Ordinamento degli eventi. Realizzazione di. Mutua Esclusione Distribuita (DME)

CONTENT MANAGEMENT SY STEM

Corso di Sistemi di Gestione di Basi di Dati. Esercitazione sul controllo di concorrenza 12/02/2004

Gestione Risorse Umane Web

Logistica magazzino: Inventari

Concetti fondamentali dei database database Cos'è un database Principali database

DB - Cenni sulla gestione delle transazioni

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

Raggruppamenti Conti Movimenti

Controllo concorrenza

Manuale di Aggiornamento BOLLETTINO. Rel DATALOG Soluzioni Integrate a 32 Bit

Utilizzando Microsoft Access. Si crea la tabella Anagrafica degli alunni,le Materie e i voti si mettono alcuni campi

Database 1 biblioteca universitaria. Testo del quesito

Definizione di domini

Introduzione alla teoria dei database relazionali. Come progettare un database

Manuale NetSupport v Liceo G. Cotta Marco Bolzon

MANUALE ESSE3 Gestione Registro delle lezioni

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

risulta (x) = 1 se x < 0.

5.2.1 RELAZIONI TRA TABELLE Creare una relazione uno-a-uno, uno-a-molti tra tabelle 9

Tutte le interrogazioni possono essere condotte su qualsiasi campo della banca dati (ad esempio, Forma, Frequenza, Lunghezza, ecc...).

UNA LEZIONE SUI NUMERI PRIMI: NASCE LA RITABELLA

NUOVO SISTEMA AGGIORNAMENTO DA FYO

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1

DBMS (Data Base Management System)

SOMMARIO... 3 INTRODUZIONE...

Capitolo 13. Interrogare una base di dati

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

Lezioni di Laboratorio sui Data Base

Transazioni. Architettura di un DBMS. Utente/Applicazione. transazioni. Transaction Manager. metadati, statistiche.

RECUPERO DATI LIFO DA ARCHIVI ESTERNI

Basi Di Dati, 09/12/2003

Organizzazione degli archivi

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

Manuale Terminal Manager 2.0

2.7 La cartella Preparazioni e CD Quiz Casa

Data Warehousing (DW)

Introduzione ai database relazionali

Progetto NoiPA per la gestione giuridicoeconomica del personale delle Aziende e degli Enti del Servizio Sanitario della Regione Lazio

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

Operazioni sui database

Dimensione di uno Spazio vettoriale

Contabilità: Estratto conto e scadenzario

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

MANUALE UTENTE Fiscali Free

Guida all uso di Java Diagrammi ER

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

TRANSAZIONI. Una transazione è una successione di operazioni che si può concludere con successo o con insuccesso.

Basi di Dati: Corso di laboratorio

1 ACCESSO AL 3 2 CARICAMENTO DELLE RICHIESTE/PRESTAZIONI MONITORAGGIO DELLE RICHIESTE DOWNLOAD ESITI...

TRASMISSIONE RAPPORTO ARBITRALE IN FORMATO PDF

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

Secondo Compitino di Basi di Dati

Il personale docente e la segreteria didattica per effettuare la gestione degli scrutini dovranno eseguire semplici operazioni.

Express Import system

EXCEL FUNZIONI PRINCIPALI

FIRESHOP.NET. Gestione Lotti & Matricole.

Uso delle tabelle e dei grafici Pivot

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

Guida Compilazione Piani di Studio on-line

Gestione Filtri. InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11

La manutenzione come elemento di garanzia della sicurezza di macchine e impianti

Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora:

Ricorsione in SQL-99. Introduzione. Idea di base

GESGOLF SMS ONLINE. Manuale per l utente

ESECUZIONE INVENTARIO TOTALE CHECKSTORE

Transcript:

BENEDETTI ALESSANDRO Matricola :252805 PROGETTO DI TECNOLOGIA DELLE BASI DI DATI PARTE 2 Testo: Sviluppare semplici programmi che permettano di verificare i diversi livelli di isolamento previsti da SQL (e da JDBC) DBMS SCELTO: PostgreSQL 8.3.1 PREMESSE Facciamo una piccola introduzione di tipo teorico: I livelli di isolamento,da noi studiati in teoria,per evitare le anomalie dovute ad accessi concorrenti alle risorse sono 4: Read Uncommitted: si utilizza di solito per transazioni read only( questo per evitare di compromettere altre transazioni e basi di dati),con questo livello di isolamento la transazione non emette lock in lettura e quando legge non rispetta i lock imposti da altre transazioni. A questo livello sono possibili tutte le anomalie, tranne la perdita di aggiornamento. Read Committed: Per effettuare le letture richiede lock Condivisi,quindi(dovendo le scritture di altre transazioni rispettare il 2PL stretto),con questo livello di isolamento la transazione non leggerà mai dati intermedi transienti,quindi si eviterà la perdita di aggiornamento e la lettura sporca. Repeatable read: Con questo livello viene applicato il 2PL stretto anche con i lock di lettura, di conseguenza anche i lock di lettura verranno rilasciati solo alla fine della transazione,dopo l eventuale abort o commit. A questo livello si evitano quindi ogni genere di anomalie tranne l inserimento fantasma. Serializable: Applicando il 2PL stretto per tutti i lock e applicando anche lock di predicato,ogni anomalia viene evitata. Isolamento in Postgresql In PostgreSQL, per ogni transazione si può richiedere uno qualsiasi dei livelli di isolamento sopra specificati. Ma internamente questo DBMS offre solo 2 livelli di isolamento, ovvero Read Committed e Serializable. Di conseguenza,selezionando Read Uncommitted,si ottiene di default Read Committed, e,selezionando repeatable read si ottiene Serializable ;questo è piuttosto importante perché in taluni casi si otterrà un livello di isolamento maggiore di quanto realmente chiesto. Questo,ovviamente, è in accordo con gli standard SQl,I quali specificano solo quali fenomeni non devono manifestarsi per un determinato livello di isolamento, e questo è sicuramente garantito dall implementazione di protezione di Postgresql. La motivazione che sta dietro a tutto ciò è quella di rendere compatibile un architettura di controllo multiversione (offerta da postgresql) con I livelli di isolamento standard prima descritti. Read Committed Isolation Level in PostgreSQL Read Committed è il livello di isolamento di default in PostgreSQL. Quando una transazione viene eseguita con questo livello di isolamento, una query di SELECT vede solo I dati di transazioni che hanno fatto il commit prima che la query fosse iniziata; non può quindi leggere dati da transazioni che non hanno effettuato il commit o da transazioni che effettuano cambiamenti nel corso dell esecuzione. (ovviamente però la select vede I cambiamenti effettuati dalla transazione medesima,anche prima di effettuare la commit). In pratica una interrogazione vede lo stato del Database all istante in cui la query è iniziata;ovviamente due interrogazioni consecutive possono vedere dati differenti,se altre transazioni modificano dati ed effettuano il commit durante l esecuzione della prima query.(vedi anomalie studiate) UPDATE, DELETE, SELECT FOR UPDATE, e SELECT FOR SHARE si comportano come la select per cercare le tuple di interesse:troveranno solo tuple I cui dati sono stati modificati da transazioni che hanno effettuato la commit. Tuttavia se una riga è stata aggiornata (o cancellata o bloccata) da un'altra transazione concorrente,al momento

dell accesso,in questa situazione si attenderà lo sblocco della tupla( quindi in 2PL stretto,si attenderà il commit o rollback della transazione concorrente). Se la prima transazione che vuole effettuare l effettua il Roll-Back, I suoi effetti sono annullati e la seconda transazione può lavorare sui dati originali. Se la prima transazione che vuole effettuare l effettua il commit, la seconda transazione ignorerà la tupla se è stata cancellata, altrimenti lavorerà sulla riga appena aggiornata. E possible quindi vedere uno stato inconsistente per una transazione di aggiornamento. Qeusto perché non viene usato il 2PL stretto per le operazioni di lettura. Serializable Isolation Level in PostgreSQL Questo livello provvede il massimo isolamento per la transazione. Questo livello emula infatti l esecuzione seriale della stessa; comunque applicazioni che usano questo livello devono essere preparate a ritirare transazioni dovute ad un fallimento di serializzazione. Quando una transazione si trova a questo livello di isolamento,un interrogazione di SELECT vede solo I dati già salvati sul DB da altre transazioni che hanno effettuato la COMMIT ;non vede mai altri dati non ancora commessi o cambiamenti commessi durante una transazione in esecuzione e concorrente alla stessa.(comunque l interrogazione vede gli effetti di aggiornamenti precedentemente compiuti dalla stessa transazione).questo è differente dal Read Committed dove la SELECT vede invece i dati come essi sono prima dell esecuzione della query. UPDATE, DELETE, SELECT FOR UPDATE, e SELECT FOR SHARE si comportano come una select nel cercare: troveranno le righe come appaiono all inizio della transazione. Tuttavia, se una riga è stata modificata da un altra transazione al momento,si attenderà il completamento o roll-back della transazione concorrente. Se la prima transazione effettua il roll back, I suoi effetti sono negati e la transazione serializable può continuare nella sua esecuzione. Ma se la prima transazione che effettua l (ed ha attualmente aggiornato la riga e non solo bloccata) allora la transazione serializable effettuerà il roll-back con tale messaggio ERROR: could not serialize access due to concurrent Perchè non può modificare o bloccare righe che sono cambiate da alter transazioni dopo che la transazione serializzabile è iniziata. -RISULTATI SPERIMENTALI- Provvederò quindi a testare i 2 livelli di isolamento concessi da postgresql relativamente ai 5 fenomeni principali di anomalia. Perdita di Aggiornamento Come ho precedentemente descritto postgresql offre solo 2 livelli di isolamento;la perdita di aggiornamento è comunque un anomalia che viene prevenuta da ogni livello di isolamento,quindi sia da Read Committed sia da Serializable. Read Committed In particolare andando a verificare il fenomeno,mediante utilizzo di thread concorrenti,ognuno associato ad una transazione e sincronizzati ad Hoc per permettere la sequenza di InterLeaving generatrice dell anomalia,possiamo osservare che utilizzando semplici query di select,l anomalia compare e non è evitata. Dobbiamo in PostgreSQL infatti modificare la sintassi del select,indicando il costrutto: FOR SHARE o FOR UPDATE,questo per far si che il DBMS effettui o meno il lock sulla risorsa ottenuta dal select. Effettuando il select for,la tupla risultante sarà bloccata e di conseguenza avremo il corretto funzionamento di READ COMMITTED e l anomalia sarà evitata. Questo perché quando la seconda transazione effettuerà il select for sullo stesso risultato della transazione precedente,la transazione sarà bloccata finchè la prima non avrà rilasciato il lock sulla tupla di interesse.con il corretto utilizzo del 2PL sarà quindi evitata questa anomalia.

T1:ISOLATION LEVEL = READ COMMITTED //la prima transazione è partita T2:ISOLATION LEVEL = READ COMMITTED //la seconda è partita for T1 Legge : 35 //la prima transazione effettua la lettura e blocca T2:eseguo la query//t2 prova ad eseguire la query ma trova la tupla locked e si mette in attesa T1 : Aggiorna il valore...//t1 effettua l aggiornamento //T1 facendo il commit effettua l unlock della tupla transazione2: T2: select for disponibilita from prodotti where id=2096 T2 Legge : 36 //ora la query di T2 è stata svolta transazione2: T2: select for disponibilita from prodotti where id=2096 T2 Legge : 37//perfetto, il valore è corretto! Viceversa non utilizzando il select for,l anomalia avrà luogo anche a livello di isolamento READ_COMMITTED, questo perché i lock non vengono gestiti in automatico (!). T2:ISOLATION LEVEL = READ COMMITTED//la seconda è partita T1:ISOLATION LEVEL = READ COMMITTED//la prima transazione è partita T1 Legge : 35//la prima transazione effettua la lettura e non blocca T2:eseguo la query transazione2: T2: select disponibilita from prodotti where id=2096 T2 Legge : 35//la seconda transazione effettua la lettura e non blocca transazione2: T2: select disponibilita from prodotti where id=2096 T2 Legge : 36//dopo l aggiornamento fatto da T2 il valore vale 36 T1 : Aggiorna il valore...//ora T1 aggiorna, ma non tiene conto dell aggiornamento di T2! T1 Legge : 36 //infatti dopo l ulteriore aggiornamento abbiamo l anomalia manifestata Serializable In questo caso se non usiamo i lock espliciti mediante le particolari forme di select o viceversa,l anomalia viene evitata e al momento di scrittura della seconda transazione concorrente viene sollevato l errore: ERROR: could not serialize access due to concurrent perché si accorge che il dato precedentemente letto è stato modificato da un altra transazione concorrente e quindi avvisa che non può procedere alla scrittura ( vedi parte relativa alla spiegazione funzionamento SERIALIZABLE in PostgreSQL).

Lettura Sporca Come ho precedentemente descritto postgresql offre solo 2 livelli di isolamento;la perdita di aggiornamento è comunque un anomalia che viene prevenuta da ogni livello di isolamento a partire dal Read Committed,quindi sia da Read Committed sia da Serializable. Testandolo sul READ_UNCOMMITED avrei dovuto ottenere l anomalia,ma come precedentemente detto,in postgresql tale livello di isolamento non viene contemplato,quello di default è difatti Read Committed. Read Committed In particolare andando a verificare il fenomeno,mediante utilizzo di thread concorrenti,ognuno associato ad una transazione e sincronizzati ad Hoc per permettere la sequenza di InterLeaving generatrice dell anomalia,possiamo osservare che l anomalia viene correttamente evitata anche senza utilizzo di select for. T2:ISOLATION LEVEL = TRANSACTION_READ_COMMITTED T1:ISOLATION LEVEL = TRANSACTION_READ_COMMITTED T1 Legge : 39 T1 : Aggiorna il valore... T1 Legge : 40 T2:tenterò di eseguire la query//t2 tenterà di eseguire la query ma troverà la risorsa bloccata,attenderà quindi l unlock T1 : abort//t1 fa l abort,annulla I suoi effetti e sblocca la risorsa Transazione2: T2: select disponibilita from prodotti where id=2096for T2 Legge : 39//T2 legge finalmente il dato, che è corretto. SERIALIZABLE Anche in questo caso il fenomeno viene evitato, il comportamento sarà leggermente diverso,poiché l anomalia sarà evitata,ma T2 leggerà il dato prima dell abort di T1. A livello teorico potrebbe sembrare errato, ma come ho precedentemente detto,a questo livello di isolamento una select vede una foto dei dati only committed all inizio della transazione stessa.ignorerà quindi il dato modificato e che sarà poi abortito. T1:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE T2:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE Transazione3: T1: select disponibilita from prodotti where id=2096 T1 Legge : 39 T1 : Aggiorna il valore... Transazione3: T1: select disponibilita from prodotti where id=2096 T1 Legge : 40 T2:tenterò di eseguire la query transazione4: T2: select disponibilita from prodotti where id=2096 T2 Legge : 39 T1 : abort//l abort di T1 è avvenuto ugualmente dopo il commit di T2 ma il risultato è comunque corretto

Riscriviamo il concetto per precisione: Quando una transazione si trova a questo livello di isolamento,un interrogazione di SELECT vede solo I dati già salvati sul DB da alter transazioni che hanno effettuato la COMMIT ;non vede mai altri dati non ancora commessi o cambiamenti commessi durante una transazione in esecuzione e concorrente alla stessa.(comunque l interrogazione vede gli effetti di aggiornamenti precedentemente compiuti dalla stessa transazione).questo è differente dal Read Committed dove la SELECT vede invece i dati come essi sono prima dell esecuzione della query. Letture Inconsistenti Questa anomalia avviene quando una transazione effettua 2 letture,che dovrebbero essere uguali ma che potrebbero risultare differenti a causa di interferenze di altre transazioni. Di conseguenza tale anomalia dovrebbe presentarsi a livello READ_COMMITTED E UNCOMMITTED ma non a livello Repeatable Read e Serializable. Vediamo i risultati sperimentali: Read Committed In particolare andando a verificare il fenomeno,mediante utilizzo di thread concorrenti,ognuno associato ad una transazione e sincronizzati ad Hoc per permettere la sequenza di InterLeaving generatrice dell anomalia,possiamo osservare che l anomalia si presenta e T1 legge 2 valori diversi e quindi inconsistenti. Questo avviene utilizzando nella seconda transazione una interrogazione Select standard o con l utilizzo della select or. T1:ISOLATION LEVEL = TRANSACTION_READ_COMMITTED T2:ISOLATION LEVEL = TRANSACTION_READ_COMMITTED Transazione3: T1: select disponibilita from prodotti where id=2096 T1 Legge : 39 T2:tenterò di eseguire la query transazione4: T2: select disponibilita from prodotti where id=2096 T2 Legge : 39 transazione4: T2: select disponibilita from prodotti where id=2096for T2 Legge : 40 Transazione3: T1: select disponibilita from prodotti where id=2096for T1 Legge : 40//anomalia,precedentemente aveva letto 39!

SERIALIZABLE In questo caso il fenomeno viene evitato ma facciamo attenzione: la prima transazione evocherà un eccezione dovuta in PostgreSQl ad un concorrenziale se per errore effettuiamo una select for (il dbms penserà infatti che nella seconda lettura poi vogliamo aggiornare e genererà la conseguente eccezione dovuta ad aggiornamenti concorrenti) T1:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE T2:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE T1 Legge : 11 T2:tenterò di eseguire la query transazione2: T2: select disponibilita from prodotti where id=2096for T2 Legge : 11 transazione2: T2: select disponibilita from prodotti where id=2096for T2 Legge : 12 T1 Legge : 11//anomalia corretta!t1 legge sempre e solo 11 (caso di inopportuno utilizzo di select for ) T2:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE T1:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE Transazione3: T1: select disponibilita from prodotti where id=2096 T1 Legge : 42 T2:tenterò di eseguire la query transazione4: T2: select disponibilita from prodotti where id=2096for T2 Legge : 42 transazione4: T2: select disponibilita from prodotti where id=2096for T2 Legge : 43 //questo avviene se per errore la seconda lettura di T1 è una select for [ERRORE IN THREAD]: nome Transazione3:, tipoerrore org.postgresql.util.psqlexception: ERROR: could not serialize access due to concurrent T1 : abort Per precisione il motivo di questa eccezione era stato precedentemente spiegato e verrà qui riportato: Ma se la prima transazione che effettua l (ed ha attualmente aggiornato la riga e non solo bloccata) allora la transazione serializable effettuerà il roll-back con tale messaggio ERROR: could not serialize access due to concurrent Perchè non può modificare o bloccare righe che sono cambiate da altre transazioni dopo che la transazione serializzabile è iniziata.

Aggiornamento fantasma (GHOST UPDATE) Questa anomalia avviene quando 2 transizioni effettuano scritture concorrenziali su più risorse,avremo bisogno quindi di transizioni leggermente più complesse per testarla.di conseguenza tale anomalia dovrebbe presentarsi a livello READ_COMMITTED E UNCOMMITTED ma non a livello Repeatable Read e Serializable. Vediamo i risultati sperimentali: Read Committed In particolare andando a verificare il fenomeno,mediante utilizzo di thread concorrenti,ognuno associato ad una transazione e sincronizzati ad Hoc per permettere la sequenza di InterLeaving generatrice dell anomalia,possiamo osservare che l anomalia si presenta. In particolare ho ipotizzato questo vincolo di integrità: ovvero che la somma dei tre valori sia 30.E facile verificare che T1 veda una somma uguale a 31 mentre nel database a fine commit questa è sempre stata di 30. Questo avviene sia con la select normale che con le varianti for o for share. Questo è proprio causato dai vincoli del livello di isolamento che non blocca in lettura con il 2PL stretto. T2:ISOLATION LEVEL = READ_COMMITTED T1:ISOLATION LEVEL = READ COMMITTED T1:la somma dei 3 valori deve essere: 30 T1 Legge x : 10 transazione2: T2: select disponibilita from prodotti where id=2097 T2 Legge y: 10 Transazione1: T1: select disponibilita from prodotti where id=2097 T1 Legge y : 10 transazione2: T2: select disponibilita from prodotti where id=2098 T2 Legge z: 10 T2 : Aggiorna il valore di y : 9 T2 : Aggiorna il valore di z : 11 Transazione1: T1: select disponibilita from prodotti where id=2098 T1 Legge z : 11 T1 : questa è la somma da me calcolata :31//ecco presentarsi l anomalia SERIALIZABLE In questo caso il fenomeno viene correttamente evitato,la motivazione,già precedentemente espressa verrà qui riepilogata: T1:ISOLATION LEVEL = SERIALIZABLE T1:la somma dei 3 valori deve essere: 30 T2:ISOLATION LEVEL = SERIALIZABLE T1 Legge x : 10 transazione2: T2: select disponibilita from prodotti where id=2097for T2 Legge y: 10 Transazione1: T1: select disponibilita from prodotti where id=2097

T1 Legge y : 10 transazione2: T2: select disponibilita from prodotti where id=2098for T2 Legge z: 10 T2 : Aggiorna il valore di y : 9 T2 : Aggiorna il valore di z : 11 Transazione1: T1: select disponibilita from prodotti where id=2098 T1 Legge z : 10 T1 : questa è la somma da me calcolata :30//perfetto!anomalia evitata! Quando una transazione si trova a questo livello di isolamento,un interrogazione di SELECT vede solo I dati già salvati sul DB da altre transazioni che hanno effettuato la COMMIT ;non vede mai altri dati non ancora commessi o cambiamenti commessi durante una transazione in esecuzione e concorrente alla stessa.(comunque l interrogazione vede gli effetti di aggiornamenti precedentemente compiuti dalla stessa transazione).questo è differente dal Read Committed dove la SELECT vede invece i dati come essi sono prima dell esecuzione della query. INSERIMENTO FANTASMA (PHANTOM) Il Phantom è un anomalia molto insidiosa ed è evitabile solo con l ultimo livello di isolamento,quindi Serializable. Avviene quando si valuta in una transazione un dato aggregato per 2 volte, e nel mezzo delle due avviene un inserimento. Vediamo a livello sperimentale : READ COMMITTED Come prevedibile a tale livello di isolamento l anomalia si verifica,purtroppo la protezione non è abbastanza: T1:ISOLATION LEVEL = TRANSACTION_READ_COMMITTED T2:ISOLATION LEVEL = TRANSACTION_READ_COMMITTED Transazione1: T1: select SUM(disponibilita) as result from prodotti p where nome='cacciavite' T1 Legge : 17123 T2:INSERT INTO prodotti (id,codice, nome, descrizione, prezzo, disponibilita)values (8132,'jdbc34', 'Cacciavite', 'cacciavite utile', 500, 1000); T2 inserito Transazione1: T1: select SUM(disponibilita) as result from prodotti p where nome='cacciavite' T1 Legge : 18123//attenzione,a causa dell inserimento fantasma vengono letti 2 valori diversi

SERIALIZABLE Grazie al lock su predicato(nel nostro caso nome= Cacciavite ) l anomalia viene evitata con successo dall ultimo livello di protezione;ricordiamo inoltre che affinchè tutta la tabella non sia bloccata sarebbe opportuno impostare un indice secondario sull attributo nome. In questo modo il lock di predicato bloccherà solo le tuple caratterizzate da tale valore per tale attributo: T2:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE T1:ISOLATION LEVEL = TRANSACTION_SERIALIZABLE Transazione1: T1: select SUM(disponibilita) as result from prodotti p where nome='cacciavite' T1 Legge : 17123 T2:INSERT INTO prodotti (id,codice, nome, descrizione, prezzo, disponibilita)values (8132,'jdbc34', 'Cacciavite', 'cacciavite utile', 500, 1000); T2 inserito Transazione1: T1: select SUM(disponibilita) as result from prodotti p where nome='cacciavite' T1 Legge : 17123//anomalia perfettamente evitata! In allegato il codice usato