Relationenkalkül, JDBC

Datenbankanwendung
Wintersemester 2014/15
Prof. Dr.-Ing. Sebastian Michel
TU Kaiserslautern
[email protected]
Anmerkungen/Ank¨undigungen
1. Bemerkung/Klarstellung zur automatischen Erkennung von
Endlosrekursion in Folien von Vorlesung 9.
2. Der Zugang zu den Musterl¨
osungen ist nur noch Uni-intern oder via
Login m¨oglich. Die Zugangsdaten sind identisch zu den Zugangsdaten
f¨
ur die Beispieldatenbanken.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
2 / 42
Relationenkalk¨
ul
¨
Ubersicht/Motivation
Der Relationenkalk¨ul
• Bisher: Relationale Algebra, prozedural
• Jetzt: Relationenkalk¨
ul, deklarativ
• beide sind gleich m¨
achtig, wenn Relationenkalk¨
ul auf sichere
Ausdr¨
ucke beschr¨ankt ist
• d.h. alle Ausdr¨
ucke der relationalen Algebra k¨
onnen auch im sicheren
Relationenkalk¨
ul ausgedr¨
uckt werden und umgekehrt.
• Zwei Varianten:
• relationaler Tupelkalk¨
ul: hatte großen Einfluss auf SQL
• relationaler Dom¨
anenkalk¨
ul: hatte großen Einfluss auf “Query-by
Example” (QBE)
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
3 / 42
Relationenkalk¨
ul
Tupelkalk¨
ul
Der relationale Tupelkalk¨ul
Eine Anfrage im relationalen Tupelkalk¨
ul hat die Form
{t|P (t)}
wobei t eine Tupelvariable ist und P (t) ein Pr¨adikat.
P (t) muss erf¨ullt sein damit t Teil des Ergebnis ist.
Auch in Kombination mit Tupelkonstruktor:
{[t1 .A1 , ..., tn .An ]|P (t1 , ..., tn )}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
4 / 42
Relationenkalk¨
ul
Tupelkalk¨
ul
Beispiele
• C4-Professoren:
{p|p ∈ P rof essoren ∧ p.Rang = C4}
• Paare von Professoren (Name) und Assistenten (PersNr):
{[p.N ame, a.P ersN r]|p ∈ P rof essoren ∧ a ∈ Assistenten
∧p.P ersN r = a.Boss}
• Studenten mit mindestens einer Vorlesung von Prof. Curie:
{s|s ∈ Studenten
∧∃h ∈ h¨
oren(s.M atrN r = h.M atrN r
∧∃v ∈ V orlesungen(h.V orlN r = v.V orlN r
∧∃p ∈ P rof essoren(p.P ersN r = v.gelesenV on
∧p.N ame = ‘Curie‘)))}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
5 / 42
Relationenkalk¨
ul
Tupelkalk¨
ul
.... in SQL ... ist es sehr ¨ahnlich:
Studenten mit mindestens einer Vorlesung von Prof. Curie:
SELECT s.*
from Studenten s
where exists (
select h.*
from h¨oren h
where h.MatrNr=s.MatrNr and exists (
select *
from Vorlesungen v
where v.VorlNr=h.VorlNr and exists (
select *
from Professoren p
where p.Name=’Curie’ and p.PersNr=v.gelesenVon)))
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
6 / 42
Relationenkalk¨
ul
Tupelkalk¨
ul
Allquantor
Wer hat alle vierst¨
undigen Vorlesungen geh¨
ort?
{s|s ∈ Studenten ∧ ∀v ∈ V orlesungen(v.SW S = 4 ⇒
∃h ∈ hoeren(h.V orlN r = v.V orlN r ∧ h.M atrN r = s.M atrN r))}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
7 / 42
Relationenkalk¨
ul
Tupelkalk¨
ul
Definition des Tupelkalk¨uls
Atome
• s ∈ R, mit s Tupelvariable und R Relationenname
• s.Aφt.B, mit s und t Tupelvariablen, A und B Attributnamen und φ
Vergleichoperator (=, 6=, ≤, ...)
• s.Aφc mit Konstante c
Formeln
• Alle Atome sind Formeln
• Ist P Formel, so auch ¬P und (P )
• Sind P1 und P2 Formeln, so auch P1 ∧ P2 , P1 ∨ P2 und P1 ⇒ P2
• Ist P (t) eine Formel mit freier Variable t, so auch ∀t ∈ R(P (t)) und
∃t ∈ R(P (t))
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
8 / 42
Relationenkalk¨
ul
Tupelkalk¨
ul
Sicherheit
• Einschr¨
ankung auf Anfragen mit endlichem Ergebnis.
• Zum Beispiel ist die Anfrage
{n|¬(n ∈ P rof essoren)}
nicht sicher.
• Das Ergebnis ist unendlich.
• Bedingung: Ergebnis des Ausdrucks muss Teilmenge der Dom¨
ane der
Formel sein.
• Die Dom¨
ane einer Formel enth¨alt
• alle in der Formel vorkommenden Konstanten
• alle Attributwerte von Relationen, die in der Formel referenziert werden
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
9 / 42
Relationenkalk¨
ul
Dom¨
anenkalk¨
ul
Der relationale Dom¨anenkalk¨ul
Der Ausdruck des relationalen Dom¨anenkalk¨
uls hat die Form
{[v1 , v2 , ..., vn ]|P (v1 , v2 , ..., vn )}
mit v1 , ...., vn Dom¨anenvariablen und P ein Pr¨adikat (oder Formel).
Beispiel:
Matrikelnummer und Namen der Pr¨
uflinge von Prof. Russel:
{[m, n]|∃s([m, n, s] ∈ Studenten
∧∃v, p, g([m, v, p, g] ∈ pruef en
∧∃a, r, b([p, a, r, b] ∈ P rof essoren
∧a =0 Russel0 )))}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
10 / 42
Relationenkalk¨
ul
Dom¨
anenkalk¨
ul
Hinweis zu freien Variablen und Quantifizierung, hier und
im Tupelkalk¨ul
{[m, n]|∃s([m, n, s] ∈ Studenten
∧∃v, p, g([m, v, p, g] ∈ pruef en
∧∃a, r, b([p, a, r, b] ∈ P rof essoren
∧a =0 Russel0 )))}
• Wie wir hier sehen wird im innersten Quantor eine Variable a f¨
ur den
Namen eines Professors benutzt.
• Man h¨
atte auch in diesem speziellen Fall den Variablennamen n
nochmal in dem Existenzquantor benutzen k¨
onnen, der Logik wegen,
da hier kein Konflikt mit dem ¨außeren “n” des Studentennamens
besteht (weil der Scope diesem eine neue Rolle zuteilt)
• Aber ohne dieses neuen Bindens von n und dann mit
. . . ∧ n =0 Russel0 ) w¨are hier die Suche auf Studenten eingeschr¨ankt
worden, die auch 0 Russel0 heißen.
Regel: Vermeiden Sie daher mehrfache Verwendung des gleichen (freien
bzw. gebundenen)
Scopes
Prof. Dr.-Ing. S.Parameternamens
Michel
TU Kaiserslauternin unterschiedlichen
Datenbankanwendung, WS 14/15
11 / 42
Relationenkalk¨
ul
Dom¨
anenkalk¨
ul
Sicherheit des Dom¨anenkalk¨uls
• Sicherheit ist analog zum Tupelkalk¨
ul
• zum Beispiel ist
{[p, n, r, o]|¬([p, n, r, o] ∈ P rof essoren)}
nicht sicher.
• Ein Ausdruck
{[x1 , x2 , ..., xn ]|P (x1 , x2 , ..., x3 )}
ist sicher, falls folgende drei Bedingungen gelten:
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
12 / 42
Relationenkalk¨
ul
Dom¨
anenkalk¨
ul
{[x1 , x2 , ..., xn ]|P (x1 , x2 , ..., x3 )} sicher falls ....
1. Falls Tupel [c1 , c2 , ..., cn ] mit Konstanten ci im Ergebnis enthalten ist,
so muss jedes ci (1 ≤ i ≤ n) in der Dom¨ane von P enthalten sein.
2. F¨
ur jede existenz-quantifizierte Teilformel ∃x(P1 (x)) muss gelten,
dass P1 nur f¨
ur Elemente aus der Dom¨ane erf¨
ullbar sein kann - oder
evtl. f¨
ur gar keine.
Das heisst: Wenn f¨
ur eine Konstante c das Pr¨adikat P1 (c) erf¨
ullt ist,
so muss c in der Dom¨ane von P1 enthalten sein.
3. F¨
ur jede universal-quantifizierte Teilformel ∀x(P1 (x)) muss gelten,
dass sie dann und nur dann erf¨
ullt ist, wenn P1 (x) f¨
ur alle Werte der
Dom¨ane von P1 erf¨
ullt ist.
Das heisst: P1 (d) muss f¨
ur alle d, die nicht in der Dom¨ane von P1
enthalten sind, auf jeden Fall erf¨
ullt sein.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
13 / 42
Relationenkalk¨
ul
Dom¨
anenkalk¨
ul
Ausdruckskraft
Die drei Sprachen
• relationale Algebra,
• relationaler Tupelkalk¨
ul, eingeschr¨ankt auf sichere Ausdr¨
ucke
• und relationaler Dom¨
anenkalk¨
ul, eingeschr¨ankt auf sichere Ausdr¨
ucke
... sind gleich m¨
achtig!
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
14 / 42
JDBC
Datenbank-Zugriff via JDBC
Java Database Connectivity
• bietet Schnittstelle f¨
ur den Zugriff auf ein DBMS aus
Java-Anwendungen
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
15 / 42
JDBC
JDBC: Connect und einfache Anfrage
1
2
3
4
5
6
// r e g i s t r i e r e g e e i g n e t e n T r e i b e r ( h i e r f u e r P o s t g r e s q l )
C l a s s . forName ( ” o r g . p o s t g r e s q l . D r i v e r ” ) ;
// e r z e u g e V e r b i n d u n g z u r Datenbank
C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n (
” jdbc : postgresql :// l o c a l h o s t / u n i v e r s i t y ” ,
” use rn a m e ” , ” p a s s w o r d ” ) ;
7
8
9
// e r z e u g e e i n e i n f a c h e s S t a t e m e n t O b j e k t
S t a t e m e n t s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
10
11
12
13
// m i t e x e c u t e Query koennen nun d a r a u f A n f r a g e n a u s g e f u e h r t
werden
// E r g e b n i s s e i n Form e i n e s R e s u l t S e t O b j e k t s
R e s u l t S e t r s e t = s t m t . e x e c u t e Q u e r y ( ”SELECT p . p e r s n r from
p r o f e s s o r e n p” ) ;
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
16 / 42
14
15
JDBC
JDBC: Connect und einfache Anfrage
// d i e s e s b e s i t z t Metadaten
R e s u l t S e t M e t a D a t a m e t a d at a = r s e t . getMetaData ( ) ;
16
17
18
// w e l c h e A t t r i b u t e ( S p a l t e n ) b e s i t z e n d i e E r g e b n i s −T u p e l ?
i n t c o l u m n c o u n t = m e ta d at a . getColumnCount ( ) ;
19
20
21
22
23
f o r ( i n t i n d e x =1; i n d e x <=c o l u m n c o u n t ; i n d e x ++) {
System . o u t . p r i n t l n ( ” S p a l t e ”+i n d e x+” h e i s s t ” +
m e t a d a t a . getColumnName ( i n d e x ) ) ;
}
24
25
26
27
28
// i t e r i e r e nun u e b e r E r g e b n i s s e
while ( r s e t . next () ) {
System . o u t . p r i n t l n ( r s e t . g e t S t r i n g ( 1 ) ) ;
}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
17 / 42
JDBC
JDBC Treiber f¨ur Postgresql
http://jdbc.postgresql.org/
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
18 / 42
JDBC
JDBC - wichtige Funktionalit¨aten
Laden des Treibers
• Kann auf verschiedene Weise erfolgen, z.B. durch explizites Laden mit dem
Klassenlader:
C l a s s . forName ( D r i v e r C l a s s N a m e ) ;
Aufbau einer Verbindung
• Connection-Objekt repr¨asentiert die Verbindung zum DB-Server
• Beim Aufbau werden URL der DB, Benutzername und Passwort aus Strings
u
¨bergeben (teilweise optional).
C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( u r l ,
l o g i n , password ) ;
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
19 / 42
JDBC
Anweisungen (Statements)
JDBC - wichtige Funktionalit¨aten (2)
Anweisungen
• Mit dem Connection-Objekt k¨
onne u.a. Metadaten der DB erfragt und
Statement-Objekte zum Absetzen von SQL-Anweisngen erzeugt werden
• Erzeugen einer SQL-Anweisung zur direkten (einmaligen) Ausf¨
uhrung
S t a t e m e n t s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
• PreparedStatement-Objekt erlaubt das Erzeugen und Vorbereiten von
(parametrisierten) SQL-Anweisungen zur wiederholten Ausf¨
uhrung
P r e p a r e d S t a t e m e n t pstmt = conn . p r e p a r e S t a t e m e n t (
” s e l e c t ∗ from p e r s o n a l where g e h a l t >= ? ” ) ;
Schließen von Verbindungen, Statements, usw.
stmt . c l o s e ( ) ;
conn . c l o s e ( ) ;
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
20 / 42
JDBC
Anweisungen (Statements)
JDBC - Anweisungen
Anweisungen (Statements)
• Werden in einem Schritt vorbereitet und ausgef¨
uhrt
Die Methode executeQuery
• f¨
uhrt die Anfrage aus und liefert Ergebnis zur¨
uck
S t a t e m e n t s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
R e s u l t S e t r s e t = stmt . executeQuery (
” s e l e c t pnr , name , g e h a l t
from p e r s o n a l where g e h a l t >=40000” ) ;
// w i r s e h e n g l e i c h , w i e man m i t d i e s e m R e s u l t S e t a r b e i t e t
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
21 / 42
JDBC
Anweisungen (Statements)
JDBC - Anweisungen
Die Methode executeUpdate
• werden zur direkten Ausf¨
uhrung von UPDATE-, INSERT-, DELETE- und
DDL-Anweisungen benutzt
S t a t e m e n t s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
i n t n = stmt . executeUpdate (
” update p e r s o n a l
set gehalt = gehalt ∗ 1.10
where g e h a l t < 20000 ” ) ;
// n e n t h a e l t d i e A n z a h l d e r a k t u a l i s i e r t e n Z e i l e n
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
22 / 42
JDBC
Anweisungen (Statements)
JDBC - Prepared Anweisungen
PreparedStatement-Objekt
P r e p a r e d S t a t e m e n t pstmt ;
double g e h a l t = 5 0 0 0 0 . 0 0 ;
pstmt = conn . p r e p a r e S t a t e m e n t (
” s e l e c t ∗ from p e r s o n a l where g e h a l t >= ? ” ) ;
• Symbol ? markiert hier freie Parameter
• Vor der Ausf¨
uhrung sind dann die Parameter einzusetzen.
• Durch Methoden entsprechend Datentyp, z.B.
pst m t . s e t D o u b l e ( 1 , g e h a l t ) ;
https://docs.oracle.com/javase/8/docs/api/java/sql/
PreparedStatement.html
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
23 / 42
JDBC
Anweisungen (Statements)
JDBC - Prepared Anweisungen (2)
Ausf¨uhren einer Prepared-Anweisung als Anfrage
P r e p a r e d S t a t e m e n t pstmt ;
double g e h a l t = 5 0 0 0 0 . 0 0 ;
pstmt = conn . p r e p a r e S t a t e m e n t (
” s e l e c t ∗ from p e r s o n a l where g e h a l t >= ? ” ) ;
Vorbereitung und Ausf¨uhrung
pstmt = con . p r e p a r e S t a t e m e n t (
” d e l e t e from p e r s o n a l where name = ? ” ) ;
pstmt . s e t S t r i n g ( 1 , ” M a i e r ” ) ;
i n t n = pstmt . executeUpdate ( ) ;
// Methoden d e r P r e p a r e d −An wei sun gen haben k e i n e Argumente
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
24 / 42
JDBC
Ergebnismengen (ResultSets)
JDBC - Ergebnismengen und Cursor
Select-Anfragen und Ergebnis¨ubergabe
• Jede JDBC-Methode, mit der man Anfragen an das DBMS stellen kann,
liefert ResultSet-Objekte als R¨
uckgabewert
R e s u l t S e t r s e t = stmt . executeQuery (
” s e l e c t pnr , name , g e h a l t
from p e r s o n a l where g e h a l t >= ” + g e h a l t ) ;
• Cursor-Zugriff und Konvertierung der DBMS-Datentypen in passende
Java-Datentypen erforderlich
• JDBC-Cursor ist durch die Methode next() der Klasse ResultSet
implementiert
https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
25 / 42
JDBC
Ergebnismengen (ResultSets)
JDBC - Ergebnismengen und Cursor (2)
Cursor →
↓ next()
getInt(”pnr”)
↓
123
456
getString(”name”)
↓
Maier
Schulze
getDouble(”gehalt”)
↓
23352.00
34553.00
Zugriff aus Java-Programm
while ( r s e t . next () ) {
System . o u t . p r i n t ( r e s . g e t I n t ( ” p n r ” )+” \ t ” ) ;
System . o u t . p r i n t ( r e s . g e t S t r i n g ( ”name” )+” \ t ” ) ;
System . o u t . p r i n t l n ( r e s . g e t S t r i n g ( ” g e h a l t ” ) ) ;
}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
26 / 42
JDBC
Ergebnismengen (ResultSets)
JDBC - Versch. Typen von ResultSets
TYPE FORWARD ONLY
• nur Aufruf von next() m¨
oglich
TYPE SCROLL INSENSITIVE
• Scroll-Operationen sind m¨
oglich, aber Aktualisierungen der Datenbank
ver¨andern ResultSet nach seiner Erstellung nicht
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
27 / 42
JDBC
Ergebnismengen (ResultSets)
JDBC - Versch. Typen von ResultSets (2)
TYPE SCROLL SENSITIVE
¨
• Scroll-Operationen m¨
in der Datenbank werden
oglich und Anderungen
ber¨
ucksichtigt
¨
ResultSet l¨asst Anderungen
zu oder nicht:
• CONCUR READ ONLY
• CONCUR UPDATABLE
S t a t e m e n t s t m t = conn . c r e a t e S t a t e m e n t (
R e s u l t S e t . TYPE SCROLL SENSITIVE ,
R e s u l t S e t . CONCUR UPDATABLE) ;
R e s u l t S e t r s e t = stmt . executeQuery ( . . . ) ;
r s e t . u p d a t e S t r i n g ( ”name” , ” S c h m i t t ” ) ;
r s e t . updateRow ( ) ;
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
28 / 42
JDBC
Metadaten
JDBC - Zugriff auf Metadaten
Allgemeine Metadaten
• Klasse DatabaseMetaData zum Abfragen von DB-Informationen
Informationen u¨ber ResultSets
• JDBC bietet die Klasse ResultSetMetaData
R e s u l t S e t s r s e t = stmt . executeQuery ( ” s e l e c t . . . ” ) ;
R e s u l t S e t M e t a D a t a rsmd = r s e t . getMetaData ( ) ;
• Abfragen von Spaltenanzahl, Spaltennamen und deren Typen
i n t a n z a h l S p a l t e n = rsmd . getColumnCount ( ) ;
S t r i n g s p a l t e n N a m e = rsmd . getColumnName ( 1 ) ;
S t r i n g typeName = rsmd . getColumnTypeName ( 1 ) ;
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
29 / 42
JDBC
Fehlerbehandlung
JDBC - Fehlerbehandlung
SQLException:
• Spezifikation der Ausnahmen, die eine Methode werfen kann, steht bei ihrer
Deklaration (throws Exception)
• Wird Code in einem try-Block ausgef¨
uhrt, werden im catch-Block
Ausnahmen abgefangen.
try {
// c o d e . . . . . .
}
catch ( SQLException e ) {
System . o u t . p r i n t l n ( ” Es i s t e i n F e h l e r a u f g e t r e t e n : ” ) ;
System . o u t . p r i n t l n ( ”Msg : ”+ e . g e t M e s s a g e ( ) ) ;
System . o u t . p r i n t l n ( ” SQLState : ”+ e . g e t S Q L S t a t e ( ) ) ;
System . o u t . p r i n t l n ( ” E r r o r C o d e : ”+ e . g e t E r r o r C o d e ( ) ) ;
// und zum debuggen noch g l e i c h dazu
e . printStackTrace () ;
}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
30 / 42
JDBC
Transaktionen
Anwendungsprogrammierung: Transaktionen
• Nicht nur eine einzelne SQL-Anweisung, sondern ganze Folge davon,
je nach Anwendung.
• Eine oder mehrere Anweisungen werden als Transaktion
zusammengefasst bzw. betrachtet. Z.B. Abheben von Geld am
Geldautomat.
begin transaction
operation1;
operation2;
operation3;
operation4;
operation5;
end transaction
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
31 / 42
JDBC
Transaktionen
Wiederholung: Transaktion - Klassisches Beispiel
Bei einer typischen Transaktion in einer Bankanwendung:
1. Lese den Kontostand von A in die Variable a: read(A, a);
2. Reduziere den Kontostand um 50 Euro: a := a − 50;
3. Schreibe den neuen Kontostand in die Datenbasis: write(A,a);
4. Lese den Kontostand von B in die Variable b: read(B, b);
5. Erh¨ohe den Kontostand um 50 Euro: b := b + 50;
6. Schreibe den neuen Kontostand in die Datenbasis: write(B, b);
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
32 / 42
JDBC
Transaktionen
Wiederholung: Transaktionen - ACID
Atomicity (Atomarit¨at)
• Alles oder nichts
Consistency
• Konsistenter Zustand der DB → konsistenter Zustand
Isolation
• Jede Transaktion hat die DB “f¨
ur sich allein”
Durability (Dauerhaftigkeit)
¨
• Anderungen
erfolgreicher Transaktionen d¨
urfen nie verloren gehen.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
33 / 42
JDBC
Transaktionen
Operationen auf Transaktione-Ebene
• begin of transaction (BOT): Mit diesem Befehl wird der Beginn
einer eine Transaktion darstellende Befehlsfolge gekennzeichnet. Ist
implizit, bei Beginn der Befehlssequenz.
• commit: Hierdurch wird die Beendigung der Transaktion eingeleitet.
¨
Alle Anderungen
der Datenbasis werden durch diesen Befehl
festgeschrieben, d.h. sie werden dauerhaft in die Datenbank
eingebaut.
• abort: Dieser Befehl f¨
uhrt zu einem Selbstabbruch der Transaktion.
Das Datenbanksystem muss sicherstellen, dass die Datenbasis wieder
in den Zustand zur¨
uckgesetzt wird, der vor Beginn der
Transaktionsausf¨
uhrung existierte.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
34 / 42
JDBC
Transaktionen
Wiederholung: Transaktionsverwaltung in SQL
¨
• commit [work]: Die in der Transaktion vollzogenen Anderungen
werden falls keine Konsistenzverletzung oder andere Probleme
aufgedeckt werden festgeschrieben. Das Schl¨
usselwort work ist
optional, d.h. das Transaktionsende kann auch einfach mit commit
“befohlen” werden.
¨
• rollback [work]: Alle Anderungen
sollen zur¨
uckgesetzt werden.
Anders als der commit-Befehl muss das DBMS die “erfolgreiche”
Ausf¨
uhrung eines rollback-Befehls immer garantieren k¨onnen.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
35 / 42
JDBC
Transaktionen
Wiederholung: Der “non-repeatable read” Fehler
Abh¨angigkeit von anderen Updates (non-repeatable read)
Transaktion T1
Transaktion T2
select sum(Kontostand)
from Konten
update Konten
set Kontostand=42000
where kontoId=12345
select sum(Kontostand)
from Konten
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
36 / 42
JDBC
Transaktionen
Wiederholung: Das “Phantomproblem”
Abh¨angigkeit von neuen/gel¨
oschten Tupeln (Phantomproblem)
Transaktion T1
Transaktion T2
select sum(Kontostand)
from Konten
insert into Konten
values (C,1000,...)
select sum(Kontostand)
from Konten
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
37 / 42
JDBC
Transaktionen
JDBC - Transaktionen
Transaktionen
• Bei der Erzeugung eines Connection-Objekts ist (in der Regel) als Default
der Modus autocommit eingestellt. D.h. nach jeder Aktion wird ein
Commit ausgef¨
uhrt.
• Um Transaktionen als Folgen von Anweisungen abwickeln zu k¨onnen, ist
dieser Modus auszuschalten.
conn . setAutoCommit ( f a l s e ) ;
• F¨
ur eine Transaktion k¨onnen sogenannte Konsistenzstufen (isolation levels)
wie TRANSACTION SERIALIZEABLE,
TRANSACTION REPEATABLE READ usw. eingestellt werden.
conn . s e t T r a n s a c t i o n I s o l a t i o n (
C o n n e c t i o n . TRANSACTION SERIALIZABLE ) ;
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
38 / 42
JDBC
Transaktionen
JDBC - Transaktionen (2)
Beendigung oder Zur¨ucksetzung
conn . commit ( ) ;
bzw.
conn . r o l l b a c k ( ) ;
// o d e r : conn . r o l l b a c k ( s a v e p o i n t )
Sicherungspunkte (Savepoints)
S a v e p o i n t s p = conn . s e t S a v e p o i n t ( ) ; // bzw . m i t Namen
S a v e p o i n t namedSp = conn . s e t S a v e p o i n t ( ” mySavePoint ” ) ;
Programm kann mit mehreren DBMS verbunden sein
• Selektives Beenden/Zur¨
ucksetzen von Transaktionen pro DBMS
• Kein global atomares Commit m¨
oglich
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
39 / 42
JDBC
Transaktionen
JDBC - Transaktionen: Beispiel
http://www.tutorialspoint.com/jdbc/jdbc-transactions.htm
try {
// Assume a v a l i d c o n n e c t i o n o b j e c t conn
conn . setAutoCommit ( f a l s e ) ;
S t a t e m e n t s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
S t r i n g SQL = ”INSERT INTO E m p l o y e e s ” +
”VALUES ( 1 0 6 , 2 0 , ' R i t a ' , ' Tez ' ) ” ;
s t m t . e x e c u t e U p d a t e (SQL) ;
// Submit a m a l f o r m e d SQL s t a t e m e n t t h a t b r e a k s
S t r i n g SQL = ”INSERTED IN E m p l o y e e s ” +
”VALUES ( 1 0 7 , 2 2 ,
' S i t a ' , ' Singh ') ” ;
s t m t . e x e c u t e U p d a t e (SQL) ;
// I f t h e r e i s no e r r o r .
conn . commit ( ) ;
} catch ( SQLException se ) {
// I f t h e r e i s any e r r o r .
conn . r o l l b a c k ( ) ;
}
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
40 / 42
JDBC
Transaktionen
JDBC - Transaktionen: Konsistenzsstufen
Default in Postgresql-JDBC ist TRANSACTION READ COMMITTED
http://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
41 / 42
JDBC
Transaktionen
Anmerkung: SQL Injections
SQL Anfragen wird in Anwendung erstellt, wobei id eine Benutzereingabe ist
. . . . ”SELECT a u t h o r , s u b j e c t , t e x t ” +
”FROM a r t i k e l WHERE ID=” + i d
Aufruf z.B. durch Webserver http://webserver/cgi-bin/find.cgi?ID=42
SQL Injection zum Aussp¨ahen von Daten
http://webserver/cgi-bin/find.cgi?ID=42+UNION+SELECT+
login,+password,+’x’+FROM+user
F¨
uhrt zur SQL Anweisung:
select author, subject, text from artikel
where ID=42 union select login, password, ’x’ from user;
Und andere F¨alle bis hin zum Einschleußen von beliebigen Code auf Rechner +
¨offnen einer Shell (abh. von DBMS)
Hilfe u.a. durch Benutzen von PreparedStatements
¨
Ubersicht
unter: http://de.wikipedia.org/wiki/SQL-Injection
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
42 / 42