pdf (1/1)

Werbung
Datenbankanwendung
Wintersemester 2014/15
Prof. Dr.-Ing. Sebastian Michel
TU Kaiserslautern
[email protected]
Anmerkungen/Ankündigungen
1. Bemerkung/Klarstellung zur automatischen Erkennung von
Endlosrekursion in Folien von Vorlesung 9.
2. Der Zugang zu den Musterlösungen ist nur noch Uni-intern oder via
Login möglich. Die Zugangsdaten sind identisch zu den Zugangsdaten
für die Beispieldatenbanken.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
2 / 42
Relationenkalkül
Übersicht/Motivation
Der Relationenkalkül
• Bisher: Relationale Algebra, prozedural
• Jetzt: Relationenkalkül, deklarativ
• beide sind gleich mächtig, wenn Relationenkalkül auf sichere
Ausdrücke beschränkt ist
• d.h. alle Ausdrücke der relationalen Algebra können auch im sicheren
Relationenkalkül ausgedrückt werden und umgekehrt.
• Zwei Varianten:
• relationaler Tupelkalkül: hatte großen Einfluss auf SQL
• relationaler Domänenkalkül: hatte großen Einfluss auf “Query-by
Example” (QBE)
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
3 / 42
Relationenkalkül
Tupelkalkül
Der relationale Tupelkalkül
Eine Anfrage im relationalen Tupelkalkül hat die Form
{t|P (t)}
wobei t eine Tupelvariable ist und P (t) ein Prädikat.
P (t) muss erfüllt 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ül
Tupelkalkül
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ören(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ül
Tupelkalkül
.... in SQL ... ist es sehr ähnlich:
Studenten mit mindestens einer Vorlesung von Prof. Curie:
SELECT s.*
from Studenten s
where exists (
select h.*
from hören 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ül
Tupelkalkül
Allquantor
Wer hat alle vierstündigen Vorlesungen gehört?
{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ül
Tupelkalkül
Definition des Tupelkalküls
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ül
Tupelkalkül
Sicherheit
• Einschränkung 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äne der
Formel sein.
• Die Domäne einer Formel enthält
• 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ül
Domänenkalkül
Der relationale Domänenkalkül
Der Ausdruck des relationalen Domänenkalküls hat die Form
{[v1 , v2 , ..., vn ]|P (v1 , v2 , ..., vn )}
mit v1 , ...., vn Domänenvariablen und P ein Prädikat (oder Formel).
Beispiel:
Matrikelnummer und Namen der Prüflinge 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ül
Domänenkalkül
Hinweis zu freien Variablen und Quantifizierung, hier und
im Tupelkalkül
{[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ür den
Namen eines Professors benutzt.
• Man hätte auch in diesem speziellen Fall den Variablennamen n
nochmal in dem Existenzquantor benutzen können, der Logik wegen,
da hier kein Konflikt mit dem äuß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äre hier die Suche auf Studenten eingeschränkt
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ül
Domänenkalkül
Sicherheit des Domänenkalküls
• Sicherheit ist analog zum Tupelkalkül
• 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ül
Domänenkalkül
{[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äne von P enthalten sein.
2. Für jede existenz-quantifizierte Teilformel ∃x(P1 (x)) muss gelten,
dass P1 nur für Elemente aus der Domäne erfüllbar sein kann - oder
evtl. für gar keine.
Das heisst: Wenn für eine Konstante c das Prädikat P1 (c) erfüllt ist,
so muss c in der Domäne von P1 enthalten sein.
3. Für jede universal-quantifizierte Teilformel ∀x(P1 (x)) muss gelten,
dass sie dann und nur dann erfüllt ist, wenn P1 (x) für alle Werte der
Domäne von P1 erfüllt ist.
Das heisst: P1 (d) muss für alle d, die nicht in der Domäne von P1
enthalten sind, auf jeden Fall erfüllt sein.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
13 / 42
Relationenkalkül
Domänenkalkül
Ausdruckskraft
Die drei Sprachen
• relationale Algebra,
• relationaler Tupelkalkül, eingeschränkt auf sichere Ausdrücke
• und relationaler Domänenkalkül, eingeschränkt auf sichere Ausdrücke
... sind gleich mächtig!
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
14 / 42
JDBC
Datenbank-Zugriff via JDBC
Java Database Connectivity
• bietet Schnittstelle für 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ür Postgresql
http://jdbc.postgresql.org/
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
18 / 42
JDBC
JDBC - wichtige Funktionalitäten
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äsentiert die Verbindung zum DB-Server
• Beim Aufbau werden URL der DB, Benutzername und Passwort aus Strings
ü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äten (2)
Anweisungen
• Mit dem Connection-Objekt könne u.a. Metadaten der DB erfragt und
Statement-Objekte zum Absetzen von SQL-Anweisngen erzeugt werden
• Erzeugen einer SQL-Anweisung zur direkten (einmaligen) Ausführung
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ührung
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ührt
Die Methode executeQuery
• führt die Anfrage aus und liefert Ergebnis zurück
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ührung 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ührung 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ühren 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ührung
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übergabe
• Jede JDBC-Methode, mit der man Anfragen an das DBMS stellen kann,
liefert ResultSet-Objekte als Rückgabewert
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öglich
TYPE SCROLL INSENSITIVE
• Scroll-Operationen sind möglich, aber Aktualisierungen der Datenbank
verändern 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öglich und Änderungen in der Datenbank werden
berücksichtigt
ResultSet lässt Änderungen 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 ü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ührt, 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öhe 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ät)
• Alles oder nichts
Consistency
• Konsistenter Zustand der DB → konsistenter Zustand
Isolation
• Jede Transaktion hat die DB “für sich allein”
Durability (Dauerhaftigkeit)
• Änderungen erfolgreicher Transaktionen dürfen 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 Änderungen der Datenbasis werden durch diesen Befehl
festgeschrieben, d.h. sie werden dauerhaft in die Datenbank
eingebaut.
• abort: Dieser Befehl führt zu einem Selbstabbruch der Transaktion.
Das Datenbanksystem muss sicherstellen, dass die Datenbasis wieder
in den Zustand zurückgesetzt wird, der vor Beginn der
Transaktionsausführung 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 Änderungen
werden falls keine Konsistenzverletzung oder andere Probleme
aufgedeckt werden festgeschrieben. Das Schlüsselwort work ist
optional, d.h. das Transaktionsende kann auch einfach mit commit
“befohlen” werden.
• rollback [work]: Alle Änderungen sollen zurückgesetzt werden.
Anders als der commit-Befehl muss das DBMS die “erfolgreiche”
Ausführung eines rollback-Befehls immer garantieren können.
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
35 / 42
JDBC
Transaktionen
Wiederholung: Der “non-repeatable read” Fehler
Abhängigkeit 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ängigkeit von neuen/gelöschten 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ührt.
• Um Transaktionen als Folgen von Anweisungen abwickeln zu können, ist
dieser Modus auszuschalten.
conn . setAutoCommit ( f a l s e ) ;
• Für eine Transaktion können 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ücksetzung
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ücksetzen von Transaktionen pro DBMS
• Kein global atomares Commit möglich
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ähen von Daten
http://webserver/cgi-bin/find.cgi?ID=42+UNION+SELECT+
login,+password,+’x’+FROM+user
Führt zur SQL Anweisung:
select author, subject, text from artikel
where ID=42 union select login, password, ’x’ from user;
Und andere Fälle bis hin zum Einschleußen von beliebigen Code auf Rechner +
öffnen einer Shell (abh. von DBMS)
Hilfe u.a. durch Benutzen von PreparedStatements
Übersicht unter: http://de.wikipedia.org/wiki/SQL-Injection
Prof. Dr.-Ing. S. Michel
TU Kaiserslautern
Datenbankanwendung, WS 14/15
42 / 42
Herunterladen