Relationenkalkül, JDBC
Transcription
Relationenkalkül, JDBC
Datenbankanwendung Wintersemester 2014/15 Prof. Dr.-Ing. Sebastian Michel TU Kaiserslautern smichel@cs.uni-kl.de 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