Transazioni

Transcript

Transazioni
Tecnologie Web T
Gestione delle Transazioni e
Livelli di Isolamento
Home Page del corso: http://www-db.disi.unibo.it/courses/TW/
Versione elettronica: 4.03.Transazioni.pdf
Versione elettronica: 4.03. Transazioni-2p.pdf
Gestione Transazioni
1
Introduzione
 Caratteristica di base delle nostre applicazioni Web è quella
di avere un elevato numero di utenti che accedono, anche
in maniera concorrente, ai dati (base di dati) verso i quali si
interfacciano
 Il sistema di gestione dei dati (DBMS) deve garantire
affidabilità e prestazioni
 la base di dati deve essere sempre in uno stato
consistente
 La gestione della concorrenza e della affidabilità
nell'accesso ai dati è una delle proprietà fondamentali che
ci offrono i moderni DBMS
 Un concetto cardine è quello di transazione
Gestione Transazioni
2
Transazioni
 Informalmente, una transazione è una sequenza di
operazioni che può concludersi con un successo o un
insuccesso
 in caso di successo: il risultato delle operazioni deve
essere permanente
 in caso di insuccesso: si deve tornare allo stato
precedente all'inizio della transazione
Gestione Transazioni
3
Definizione di transazione
 Transazione
 parte di programma caratterizzata da un inizio
(begin-transaction, start transaction in SQL),
una fine (end-transaction, non esplicitata in SQL) e
al cui interno deve essere eseguito una e una sola volta
uno dei seguenti comandi:
 commit work
per terminare correttamente
 rollback work per abortire la transazione
 Un sistema transazionale (OLTP) è in grado di definire ed
eseguire transazioni per conto di un certo numero di
applicazioni concorrenti
Gestione Transazioni
4
Applicazioni e transazioni
 L'esecuzione di un programma può essere visto come una
sequenza di transazioni (eventualmente intervallate da
operazioni non relative ai dati)
begin T1
AZIONI
PROGRAMMA
APPLICATIVO
TRANSAZIONE
T1
end T1
begin T2
AZIONI
TRANSAZIONE
T2
end T2
Gestione Transazioni
5
Una transazione SQL
 Esempio:
“trasferimento di 10 unità dal conto 42177 al conto 12202”
start transaction;
update ContoCorrente
set Saldo = Saldo + 10
where NumConto = 12202;
update ContoCorrente
set Saldo = Saldo - 10
where NumConto = 42177;
commit work;
Gestione Transazioni
6
Una transazione con varie decisioni
 Esempio: “trasferimento di 10 unità dal conto 42177 al
conto 12202 con il controllo che il saldo del cc da cui si
preleva sia positivo”
start transaction;
update ContoCorrente
set Saldo = Saldo + 10
where NumConto = 12202;
update ContoCorrente
set Saldo = Saldo – 10
where NumConto = 42177;
select Saldo as A
from ContoCorrente
where NumConto = 42177;
if (A>=0)
then commit work;
else rollback work;
Gestione Transazioni
7
Il concetto di transazione
 Una definizione più precisa di transazione: unità di
elaborazione che gode delle proprietà "ACIDE" (ACID):
 Atomicità
 Consistenza
 Isolamento
 Durabilità (persistenza)
Gestione Transazioni
8
ACID: Atomicità
 Una transazione è una unità atomica (tutto o niente) di
elaborazione
 È fondamentale per garantire l'integrità dei dati
 Se qualcosa va storto il sistema deve essere in grado di
annullare tutti i cambiamenti fatti a partire dall'inizio della
transazione
 La base di dati non può essere lasciata in uno stato
intermedio
 un guasto o un errore prima del commit debbono causare
l'annullamento (UNDO) delle operazioni svolte
 un guasto o errore dopo il commit non deve avere conseguenze
 Esito
 Commit = caso "normale" e più frequente
 Abort (o rollback)
 richiesto dall'applicazione = suicidio
 richiesto dal sistema (violazione dei vincoli, concorrenza, incertezza in
caso di fallimento) = omicidio
Gestione Transazioni
9
ACID: Consistenza
 La transazione rispetta i vincoli di integrità
 Conseguenza:
 se lo stato iniziale è corretto
 anche lo stato finale è corretto
Gestione Transazioni
10
ACID: Isolamento
 La transazione non risente degli effetti delle altre
transazioni concorrenti
 l'esecuzione concorrente di una collezione di transazioni
deve produrre un risultato che si potrebbe ottenere con
una esecuzione sequenziale
 Conseguenza: una transazione non espone i suoi stati
intermedi
Gestione Transazioni
11
ACID: Durabilità (Persistenza)
 Gli effetti di una transazione andata in commit non vanno
perduti ("durano per sempre"), anche in presenza di guasti
 Commit significa impegno
Gestione Transazioni
12
Controllo di concorrenza
 Se la proprietà di isolamento non è completamente
soddisfatta, due (o più) transazioni effettuate su un
database consistente possono portare il database in uno
stato inconsistente
 Due azioni sullo stesso oggetto si dicono essere in
confitto se almeno una delle due è una operazione di
scrittura
 Date due transazioni T1 e T2 in conflitto, si possono
verificare tre tipologie di situazioni anomale
 conflitto Write-Read (W-R):
T2 legge un dato precedentemente scritto da T1
 conflitto Read-Write (R-W):
T2 scrive un dato precedentemente letto da T1
 conflitto Write-Write (W-W):
T2 scrive un dato precedentemente scritto da T1
Gestione Transazioni
13
Conflitti WR: Reading uncommitted data
 Si può verificare una anomalia se una transazione T2 legge
un dato che è stato modificato da una transazione T1 non
ancora conclusa (quindi uncommitted)
 In particolare questa situazione può generare
 letture sporche
Gestione Transazioni
14
Lettura sporca
 t1 traferisce 100€ da A a B
 t2 incrementa sia A che B del 6%
N.B. Assumiamo sempre un begin of transaction (BOT) come prima operazione
di ogni transazione
Gestione Transazioni
15
Lettura sporca
 supponiamo che sia A che B all'inizio valgano
1000: con una esecuzione seriale t1 t2
t1
t2
tempo
r1(A)
A = A - 100
w1(A)
r1(B)
B = B + 100
w1(B)
commit
 A = 900*1.06 = 954
 B = 1100*1.06 = 1166
 A+B=2120
r2(A)
A = A * 1.06
w2(A)
r2(B)
B = B * 1.06
w2(B)
commit
Gestione Transazioni
16
Lettura sporca
 supponiamo che sia A che B all'inizio valgano
1000: con una esecuzione seriale t2 t1
t1
t2
tempo
r2(A)
A = A * 1.06
w2(A)
r2(B)
B = B * 1.06
w2(B)
commit
r1(A)
A = A - 100
w1(A)
r1(B)
B = B + 100
w1(B)
commit
• A = 960
• B = 1160
• A+B = 2120
Gestione Transazioni
17
Lettura sporca
 supponiamo che sia A che B all'inizio valgano
1000: con esecuzione concorrente di t2 t1
t1
tempo
r1(A)
A = A - 100
w1(A)
t2
r2(A)
A = A * 1.06
w2(A)
r2(B)
B = B * 1.06
w2(B)
commit
r1(B)
B = B + 100
w1(B)
commit




t2 ha letto uno stato intermedio ("sporco")
A = 954
B = 1160
NB: alla fine qualcuno ci ha perso ... e il totale cambia: chi ha guadagnato?
Gestione Transazioni
18
Conflitti RW: Unrepeatable read
 Si possono verificare diverse anomalie se una transazione
T2 cambia il valore di un dato che è stato letto da una
transazione T1 mentre T1 è ancora in esecuzione
 In particolare, questa situazione può generare:
 perdita di aggiornamento, lettura inconsistente
(unrepeatable read)
Gestione Transazioni
19
Letture inconsistenti
 t1 legge due volte x:
t1
t2
tempo
r1(x)
r2(x)
x=x+1
w2(x)
commit
r1(x)
commit
 t1 legge due valori diversi per x !
Gestione Transazioni
20
Perdita di aggiornamento
 Due transazioni identiche:
 t 1:
r(x), x = x + 1, w(x)
 t2 :
r(x), x = x + 1, w(x)
 Inizialmente x=2; dopo una esecuzione seriale x=4
 Una esecuzione concorrente:
tempo
t1
t2
r1(x)
x=x+1
r2(x)
x=x+1
w1(x)
commit
w2(x)
commit
 Un aggiornamento viene perso: x = 3
Gestione Transazioni
21
Conflitti WW: Overwriting uncommitted data
 Si possono verificare anomalie se una transazione T2
sovrascrive il valore di un dato che è già stato modificato da
una transazione T1, mentre T1 è ancora in esecuzione
 questa situazione può generare effetti fantasma
Gestione Transazioni
22
Effetti fantasma
vincolo: x+y+z=1000
t1
t2
sum = 0
read(x)
sum = sum + x
tempo
read(y)
y = y - 100
write(y)
T1 calcola in maniera errata
la somma di x, y, z
read(y)
sum = sum + y
read(z)
sum = sum + z
commit
(supponiamo T2 stia
spostando soldi dal
conto y al conto z: il totale
di cassa non cambia … per
T1 invece si!)
read(z)
z = z + 100
write(z)
commit
Gestione Transazioni
23
Gestione di transazioni mediante lock
 I DBMS per evitare anomalie nelle transazione concorrenti
usano diverse tecniche
 Una delle più comuni è basata su lock
 Il lock è un meccanismo che blocca l'accesso ai dati ai
quali una transazione accede ad altre transazioni
 lock a livello di riga, tabella, database
 lock in operazioni di scrittura/lettura
 Quando una risorsa è bloccata, le transazioni che ne
richiedono l'accesso vengono messe in coda
 quindi devono aspettare (che il lock sia rimosso)
 In sostanza, questo è un meccanismo efficace, ma influisce
sulle prestazioni
Gestione Transazioni
24
Livelli di isolamento
 Idealmente vorremmo avere sempre garantita la proprietà
di isolamento delle transazioni
 Ma questa proprietà ha dei costi che possono limitare le
prestazioni del sistema
 I DBMS offrono diversi livelli di isolamento:
 maggiori restrizioni, minori prestazioni
 Il programmatore deve conoscere i livelli di isolamento e
scegliere quello sufficiente ai propri obiettivi
Gestione Transazioni
25
Livelli di isolamento SQL
 SERIALIZABLE assicura che
 la transazione T legge solo cambiamenti fatti da transazioni concluse
 nessun valore letto o scritto da T verrà cambiato da altre transazione finché
T non è conclusa
 se T legge un insieme di valori acceduti secondo qualche condizione di
ricerca, l'insieme non viene modificato da altre transazione finché T non è
conclusa
 REPEATABLE READ assicura che
 la transazione T legge solo cambiamenti fatti da transazioni concluse
 nessun valore letto o scritto da T verrà cambiato da altre transazione finché
T non è conclusa
 READ COMMITTED assicura che
 la transazione T legge solo cambiamenti fatti da transazioni concluse
 T non vede nessun cambiamento eventualmente effettuato da transazioni
concorrenti non concluse tra i valori letti all'inizio di T
 READ UNCOMMITTED
 a questo livello di isolamento una transazione T può leggere modifiche fatte
ad un oggetto da un transazione in esecuzione; ovviamente l'oggetto può
essere cambiato mentre T è in esecuzione. Quindi T è soggetta a effetti
fantasma
Gestione Transazioni
26
Livelli di isolamento SQL
 Il livello di isolamento può essere scelto per ogni
transazione
 read uncommitted permette letture sporche, letture
inconsistenti, aggiornamenti fantasma e inserimenti
fantasma
 read committed evita letture sporche ma permette
letture inconsistenti, aggiornamenti fantasma e
inserimenti fantasma
 repeatable read evita tutte le anomalie esclusi gli
inserimenti fantasma
 serializable evita tutte le anomalie
 Nota: la perdita di aggiornamento è sempre evitata
 Inoltre le transazioni possono essere definite
read-only
Gestione Transazioni
27
Livelli di isolamento e anomalie
livello di
isolamento
lettura sporca
lettura
inconsistente
effetto
fantasma
READ
UNCOMMITTED
può verificarsi
può verificarsi
può verificarsi
READ
COMMITTED
NO
può verificarsi
può verificarsi
REPEATABLE
READ
NO
NO
può verificarsi
SERIALIZABLE
NO
NO
NO
Gestione Transazioni
28
Transazioni in SQL
START TRANSACTION
SET TRANSACTION ISOLATION LEVEL livello
istruzioni SQL
COMMIT
Gestione Transazioni
29
Transazioni in JDBC
 Scelta della modalità delle transazioni: un metodo definito
nell'interfaccia Connection:
setAutoCommit(boolean autoCommit)
 connection.setAutoCommit(true)
 (default) "autocommit ": ogni operazione è una
transazione
 connection.setAutoCommit(false)
 gestione delle transazioni da programma
connection.commit()
connection.rollback()
 N.B. non c'è start transaction
Gestione Transazioni
30
JDBC e livelli di isolamento
 Il metodo setTransactionIsolation() permette di
modificare il livello di isolamento delle transazioni
 Riceve un parametro intero che può assumere uno dei
valori costanti definiti nella interfaccia Connection
 TRANSACTION_NONE: le transazioni non vengono
supportate. Passare questo parametro a
setTransactionIsolation() è equivalente ad una
chiamata al metodo setAutoCommit(true)
 TRANSACTION_READ_UNCOMMITTED: nessun livello di
isolamento è garantito, quindi possono presentarsi tutte
le anomalie
Gestione Transazioni
31
JDBC e livelli di isolamento
 TRANSACTION_READ_COMMITTED: vengono prevenute
solo le letture sporche. Le altre anomalie possono
ancora presentarsi
 TRANSACTION_REPEATABLE_READ: possono
presentarsi solo inserimenti fantasma
 TRANSACTION_SERIALIZABLE: è il massimo livello di
isolamento. Nessuna anomalia può presentarsi
Gestione Transazioni
32
Esempio transazioni con JDBC
public
public void
void evadiOrdine
evadiOrdine (int
(int codProdotto,
codProdotto, String
String idOrdine,
idOrdine, int
int qnt,
qnt, Connection
Connection con)
con)
throws
throws PersistenceException
PersistenceException {
{
try { try {
con.setAutoCommit(false);
con.setAutoCommit(false);
con.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ);
con.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ);
PreparedStatement
updateProd updateProd
=
PreparedStatement
=
con.prepareStatement("UPDATE
con.prepareStatement("UPDATE prodotti
prodotti
SET
quantita=(quantita
SET quantita=(quantita - ?)
?)
WHERE
WHERE codiceProdotto
codiceProdotto =
= ?
? ");
");
updateProd.setInt(1,
codProdotto);
updateProd.setInt(1,
codProdotto);
updateProd.setInt(2,
qnt);
updateProd.setInt(2, qnt);
PreparedStatement
updateOrd =
PreparedStatement
updateOrd =
con.prepareStatement("UPDATE
ordini SET ordini
stato =
'evaso'
con.prepareStatement("UPDATE
SET
stato where
= 'evaso'
idOrdine=?");
where idOrdine=?");
updateOrd.setInt(1,
idOrdine); idOrdine);
updateOrd.setInt(1,
int nProd =
prepareProd.executeUpdate();
int nProd = prepareProd.executeUpdate();
int nOrd =
prepareOrd.executeUpdate();
int
nOrd = prepareOrd.executeUpdate();
if (nProd+nOrd
!= 2)
if (nProd+nOrd
!= 2)
con.rollback();
con.rollback();
else
else
con.commit();
con.commit();
} catch (SQLException ex) {
try
{
} catch
(SQLException ex) {
con.rollback();
try {
throw
new PersistenceException("Transaction failed: " +
con.rollback();
ex.getMessage());
throw (SQLException
new PersistenceException("Transaction
failed: " + ex.getMessage());
} catch
sqx) {
}
catch
(SQLException
sqx)
{
throw new PersistenceException("Rollback failed: " + sqx.getMessage());
throw new PersistenceException("Rollback failed: " + sqx.getMessage());
}
}
}
}
}
}
Gestione Transazioni
33
JDBC e livelli di isolamento
 Attenzione: non tutti i DBMS supportano le transazioni e
non tutti quelli che le supportano permettono l'impostazioni
di tutti i livelli di isolamento previsti da JDBC
 È compito del programmatore che usa l'API JDBC verificare
le effettive capacità del DBMS in uso
 A tal fine l'interfaccia Connection mette a disposizione
 il metodo getMetaData(), che restituisce
 un oggetto DatabaseMetaData
Gestione Transazioni
34
JDBC e livelli di isolamento
 L'interfaccia DatabaseMetaData offre metodi per reperire
informazioni sul DBMS
 In particolare, per verificare il supporto alle transazioni,
abbiamo i metodi:
 supportsTransactions(): restituisce true se le
transazioni sono supportate dal database, false se non
lo sono. In questo ultimo caso, il metodo commit() non
esegue alcuna operazione e il livello di isolamento è
sempre TRANSACTION_NONE
 supportsTransactionIsolationLevel(int):
permette di sapere se il DBMS supporta il livello di
isolamento passato come parametro (secondo le
costanti definite dall'interfaccia Connection nella slide
precedente)
Gestione Transazioni
35
JDBC e livelli di isolamento
import java.sql.*;
public class TransactionCapabilities {
public static void main(String[] args) throws SQLException {
try {
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
} catch(ClassNotFoundException e) {
System.err.println("Driver non trovato");
}
String url = "jdbc:db2:tw_stud";
Connection con = null;
try {
con = DriverManager.getConnection(url, “******", “******");
}catch(SQLException e){
System.err.println("Connessione non restituita");
}
try {
DatabaseMetaData dbMetaData = con.getMetaData();
if (dbMetaData.supportsTransactions())
System.out.println("tranzazioni supportate");
if
(dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED))
System.out.println("TRANSACTION_READ_UNCOMMITTED");
if
(dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED))
System.out.println("TRANSACTION_READ_COMMITTED");
if
(dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ))
System.out.println("TRANSACTION_REPEATABLE_READ");
if
(dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE))
System.out.println("TRANSACTION_SERIALIZABLE");
} catch(SQLException e){
System.err.println("Errori lettura metadati");
} finally {
con.close();
}
}
}
Gestione Transazioni
36
Limiti di JDBC
 JDBC rappresenta una buona soluzione per la gestione di
transazioni che manipolano un unico DB, ovvero che
coinvolgono una unica Connection!
 In sistemi che manipolano dati appartenenti a diversi DB,
ogni unità di lavoro richiede l’accesso a più di una risorsa
 in questi casi non è possibile garantire la propietà ACID
di atomicità con JDBC!
 Occorre un transaction manager in grado di gestire diverse
sorgenti dati (DB) in un unico sistema transazionale 
Gestione Transazioni
37
Java Transaction API (JTA)
 Java Transaction API (JTA) fornisce un servizio per la
gestione di transazioni distribuite per la piattaforma J2EE
 Una transazione distribuita coinvolge un transaction
manger e uno o più resource manger (ovvero qualunque
tipo di datastore persistente)
 Il transaction manger è responsabile del coordinamento
di tutti i partecipanti alla transazione
Gestione Transazioni
38
JTA
 JTA permette l’interazione con lo sviluppatore mediante
l’interfaccia javax.transaction.UserTransaction e
 i metodi begin(), commit() e rollback()
Starting a transaction with JTA: Example
import javax.transaction.*;
import javax.naming.*;
// ...
UserTransaction utx = (UserTransaction) new InitialContext()
.lookup("java:comp/UserTransaction");
utx.begin();
// ...
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "Spinal Tap");
pstmt.executeUpdate();
// ...
utx.commit();
// ...
Gestione Transazioni
39
Transazioni e Hibernate
 Come visto nelle precedenti lezioni, Hibernate astrae dalle
API JDBC/JTA sottostanti
 livello di applicazione può essere trasparente a questi
dettagli
 Hibernate espone l’interfaccia
org.hibernate.Transaction
che permette di lavorare “on top” a JDBC e JTA
 Rappresenta la demarcazione unificata delle transazioni
 Compatibile sia a JDBC che a JTA
 Il maggior beneficio di Hibernate rispetto a JDBC e JTA è di
permettere stretta integrazione con il contesto di
persistenza
 Es. flush automatico di Session al commit
Gestione Transazioni
40
Transazioni e Hibernate: Esempio
import java.util.*;
import org.hibernate.*;
import persistence.HibernateUtil;
//...
//First unit of work
Session session =
HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
User user = new User("pippo");
String userId = (String) session.save(user);
tx.commit();
session.close();
//...
Gestione Transazioni
41
Hibernate
 Come già sappiamo, l’interfaccia principale di Hibernate è
Session
 All'apertura di un nuovo oggetto della classe Session
 metodo openSession()della classe
SessionFactory
 viene creata una nuova connessione JDBC con la base di
dati
 di default, Hibernate imposta l'autocommit a false ;
dunque comincia a tutti gli effetti una transazione JDBC
Gestione Transazioni
42
Hibernate
 Una Session Hibernate si dice essere “pigra”; questo è un
punto a favore di Hibernate
 La Session non consuma alcuna risorsa fino a che le
stesse non sono strettamente necessarie
 Solo all’inizio di una transazione viene resa disponibile una
Connection dal pool di connessioni
 La chiamata beginTransaction() si traduce in
setAutoCommit(false) nella Connection JDBC
corrispondente
Gestione Transazioni
43
Hibernate
 Il blocco di statement SQL di una transazione sono
eseguiti seguendo la regola “il più tardi possibile”
(write-behind ), ovvero al flushing del contesto di
persistenza della Session
 Ciò accade di default al commit() di Transaction
 Dopo il commit (o il roll-back) della transazione la
connessione è rilasciata e “unbound” dalla Session
 L’inizio di una nuova transazione con la stessa Session
necessita di una nuova connessione dal pool di
connessioni disponibili
Gestione Transazioni
44
Locking ottimistico di sessione
 In caso di accesso concorrente, affinché non occorrano
anomalie di tipo lost-update, Hibernate prevede la
possibilità di abilitare un meccanismo di locking ottimistico
tale che nel momento in cui viene invocato il flushing,
verifica se la porzione della base di dati che sarà modificata
non sia cambiata
 se è cambiata lancia una eccezione
StaleObjectStateException
 Per abilitare il locking ottimistico, nell'elemento class del
file di mapping relativo alla classe su cui verte la modifica, è
necessario definire l'attributo optimistic-lock
pari a all
Gestione Transazioni
45
Long-lived transactions
 Tra il momento in cui si leggono i dati dal DB ed il momento
in cui eventuali modiche si rendono persistenti può
trascorrere molto tempo
 Hibernate applica il pattern session-per-conversation: è
necessario disabilitare il flushing automatico chiamando il
metodo setFlushMode(FlushMode.MANUAL)
quando la sessione è aperta
 l'isolamento è garantito in quanto, abilitando il locking
ottimistico, le modiche fatte in transazioni concorrenti
sono riconosciute
 l'atomicità è garantita dal fatto che il flushing viene
eseguito solo al termine della transazione, e se la
sessione viene chiusa senza fare il flushing, la
transazione viene abortita
Gestione Transazioni
46
Controllo ottimistico di concorrenza
 Per la gestione efficiente di accessi concorrenti Hibernate
sfrutta la tecnica Optimistic Concurrency Control (OCC)
 OCC si basa sull’assunzione che la maggior parte delle
transazioni verso DB non sono in conflitto con altre
transazioni; questo permette di essere piuttosto
“permissivi” nel rilasciare la possibilità di esecuzione
 Se i conflitti sono rari, post-validazioni possono essere
svolte efficientemente => alto throughput
 OCC sfrutta versioning dei dati per ottenere elevati gradi
di concorrenza e alta scalabilità
 Version checking sfrutta numeri di versione o timestamp
per fare la detection di aggiornamenti che possono
determinare conflitti
Gestione Transazioni
47
Riferimenti
 JDBC API:
 http://java.sun.com/j2se/1.5.0/docs/api/
index.html
 Hibernate API:
 http://docs.jboss.org/hibernate/core/
3.5/api/
 Atzeni, Ceri, Fraternali, Paraboschi, Torlone “Basi di
dati – Architetture e linee di evoluzione”, McGraw-Hill
Italia, 2009
 Christian Bauer and Gavin King. “Java Persistence
with Hibernate”, Manning
Gestione Transazioni
48

Documenti analoghi

Basi di dati e Web introduzione

Basi di dati e Web introduzione Inizia con un begin transaction. Termina con un end transaction. La sua esecuzione comporta il raggiungimento di un commit o di un rollback work e dopo il commit/rollback non si eseguono altri acce...

Dettagli

Le transazioni

Le transazioni operazioni non sono visibili al mondo esterno. Dopo l’eventuale commit, le operazioni effettuate sono

Dettagli

Tecnologia di un Database Server - Dipartimento di Matematica e

Tecnologia di un Database Server - Dipartimento di Matematica e • begin (o start) transaction (bot) e end transaction (eot) Il comando end transaction è di norma implicito. Se viene omesso il comando begin/start transaction, il sistema assume che ogni singola ...

Dettagli

transazioni distribuite - Dipartimento di Ingegneria dell`Informazione

transazioni distribuite - Dipartimento di Ingegneria dell`Informazione Una transazione è una unità elementare di lavoro svolta da una applicazione; comandi di transazione: – Start transaction / end transaction – Commit / Rollback

Dettagli