29
Realisierung verteilter Anwendungen: Teil 7 Beim vorigen Mal: Multitier-Architekturen: Enterprise Java Beans Inhalt heute: Fortsetzung der Einführung zu Multitier- Architekturen Transaktionen Lernziele: Grundverständnis für die EJB-Architektur, insbesondere Transaktionen Ralf Möller, FH-Wedel

Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Embed Size (px)

Citation preview

Page 1: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Realisierung verteilter Anwendungen: Teil 7

Beim vorigen Mal: Multitier-Architekturen: Enterprise Java Beans

Inhalt heute: Fortsetzung der Einführung zu Multitier-

Architekturen Transaktionen

Lernziele: Grundverständnis für die EJB-Architektur,

insbesondere Transaktionen

Ralf Möller, FH-Wedel

Page 2: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Nebenläufigkeit und Transaktionen

Der erste Teil dieser Vorlesung (13 Präsentationen) baut auf der Vorlesung "P3" von Bernd Neumann an der Universität Hamburg auf.

Für eine Vertiefung desThemas Transaktionen und Sperren (Locks) siehe Kapitel 12 aus:

Page 3: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Beispiel Kontoführung

Prozeß 1: Umbuchung eines Betrages von Konto A nach Konto BProzeß 2: Zinsgutschrift für Konto A

Umbuchungread (A, a1)a1 := a1 - 300write (A, a1)read (B, b1)b1 := b1 + 300write (B, b1)

Zinsgutschriftread (A, a2)a2 := a2 * 1.03write (A, a2)

Möglicher verzahnter Ablauf:

Umbuchung Zinsgutschriftread (A, a1)a1 := a1 - 300

read (A, a2)a2 := a2 * 1.03write (A, a2)

write (A, a1)read (B, b1)b1 := b1 + 300write (B, b1)

Wo ist die Zinsgutschrift geblieben??

Page 4: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Beispiel Besucherzählung

Drehkreuz1:loop {read (Counter, c1)if (c1 ≥ MaxN) lockif (c1 < MaxN) openif enter incr(c1)if leave decr(c1)write (Counter, c1)}

Drehkreuz2:loop {read (Counter, c2)if (c2 ≥ MaxN) lockif (c2 < MaxN) openif enter incr(c2)if leave decr(c2)write (Counter, c2)}

Verzahnte Ausführung der zwei Prozesse Drehkreuz1 und Drehkreuz2 mit Zugriff auf gemeinsamen Counter kann inkorrekte Besucherzahl ergeben!

=> Überfüllung, Panik, Katastrophen durch Studium der Nebenläufigkeit vermeiden

Page 5: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Mehrbenutzersynchronisation

Die nebenläufige Ausführung mehrerer Prozesse auf einem Rechner kann grundsätzlich zu einer besseren Ausnutzung des Prozessors führen, weil Wartezeiten eines Prozesses (z.B. auf ein I/O-Gerät) durch Aktivitäten eines anderen Prozesses ausgefüllt werden können.

Zeitunverzahnte Ausführung

verzahnte Ausführung

Prozesse synchronisieren = partielle zeitliche Ordnung herstellen

Page 6: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Mehrbenutzerbetrieb von Datenbanksystemen

Um Probleme durch unerwünschte Verzahnung nebenläufiger Zugriffe (s. Beispiel Kontoführung) zu vermeiden, werden atomare Aktionen zu größeren Einheiten geklammert: Transaktionen.Eine Transaktion ist eine Folge von Aktionen (Anweisungen), die ununterbrechbar ausgeführt werden soll.

Da Fehler während einer Transaktion auftreten können, muß eine Transaktionsverwaltung dafür sorgen, daß unvollständige Transaktionen ggf. zurückgenommen werden können.Befehle für Transaktionsverwaltung:• begin of transaction (BOT) Beginn der Anweisungsfolge einer Transaktion • commit Einleitung des Endes einer Transaktion,

Änderungen der Datenbasis werden festgeschrieben• abort Abbruch der Transaktion, Datenbasis wird in den

Zustand vor der Transaktion zurückversetzt

Page 7: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Eigenschaften von Transaktionen

ACID-Paradigma steht für 4 Eigenschaften:

Atomicity (Atomarität)Eine Transaktion wird als unteilbare Einheit behandelt ("alles-oder-nichts").

Consistency (Konsistenz)Eine Transaktion hinterläßt nach (erfolgreicher oder erfolgloser) Beendigung eine konsistente Datenbasis.

IsolationNebenläufig ausgeführte Transaktionen beeinflussen sich nicht gegenseitig.

Durability (Dauerhaftigkeit)Eine erfolgreich abgeschlossene Transaktion hat dauerhafte Wirkung auf die Datenbank, auch bei Hardware- und Software-Fehlern.

Page 8: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Mehrbenutzerbetrieb in DBsystemenSynchronisation mehrerer nebenläufiger Transaktionen:• Bewahrung der indendierten Semantik einzelner Transaktionen• Protokolle zur Sicherung der Serialisierbarkeit • Sicherung von Rücksetzmöglichkeiten im Falle von Abbrüchen• Vermeidung von Schneeballeffekten beim Rücksetzen• Behandlung von Verklemmungen

Page 9: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Synchronisation bei Mehrbenutzerbetrieb

Synchronisationsproblem = verzahnte sequentielle Ausführung nebenläufiger Transaktionen, so daß deren Wirkung der intendierten unverzahnten ("seriellen") Hintereinanderausführung der Transaktionen entspricht.

Konfliktursache im DB-Kontext ist read und write von zwei Prozessen i und k auf dasselbe Datum A: readi(A) readk(A) Reihenfolge irrelevant, kein Konflikt

readi(A) writek(A) Reihenfolge muß spezifiziert werden, Konflikt

writei(A) readk(A) analog

writei(A) writek(A) Reihenfolge muß spezifiziert werden, Konflikt

Serialisierbarkeitsgraph:Knoten = atomare Operationen (read, write)Kanten = Ordnungsbeziehung (Operation i vor Operation k)

Serialisierbarkeitstheorem:Eine partiell geordnete Menge nebenläufiger Operationen ist genau dann serialisierbar, wenn der Serialisierungsgraph zyklenfrei ist.

Page 10: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Beispiel für nicht serialisierbare Historie

T1 T2

BOTread(A)write(A)

BOTread(A)write(A)read(B)write(B)commit

read(B)write(B)commit

Der Effekt dieser Verzahnung entspricht keiner der 2 möglichen Serialisierungen T1 vor T2 oder T2 vor T1: Die Historie ist nicht serialisierbar

T1 T2

BOTread(A)write(A)read(B)write(B)commit

BOTread(A)write(A)read(B)write(B)commit

T1 T2

BOTread(A)write(A)read(B)write(B)commit

BOTread(A)write(A)read(B)write(B)commit

verzahnte Historie Serialisierung 1 Serialisierung 2

Page 11: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Sperrsynchronisation

Viele Datenbank-Scheduler verwenden Sperranweisungen zur Erzeugung konfliktfreier Abläufe:

• Sperrmodus S (shared, read lock, Lesesperre)Wenn Transaktion Ti eine S-Sperre für ein Datum A besitzt, kann Ti read(A) ausführen. Mehrere Transaktionen können gleichzeitig eine S-Sperre für dasselbe Objekt A besitzen.

• Sperrmodus X (exclusive, write lock, Schreibsperre)Nur eine einzige Transaktion , die eine X-Sperre für A besitzt, darf write(A) ausführen.

Verträglichkeit der Sperren untereinander: (NL = no lock, keine Sperrung)

NL S X

S ok ok -

X ok - -

Page 12: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Zwei-Phasen-Sperrprotokoll(Englisch: two-phase locking, 2PL)Protokoll gewährleistet die Serialisierbarkeit von Transaktionen.Für jede individuelle Transaktion muß gelten:

Verschärfung zum "Strengen 2PL-Protokoll" zur Vermeidung nicht-rücksetzbarer Abläufe:Keine Schrumpfungsphase, alle Sperren werden bei EOT freigegeben.

1. Jedes von einer Transaktion betroffene Objekt muß vorher entsprechend gesperrt werden.

2. Eine Transaktion fordert eine Sperre, die sie besitzt, nicht erneut an.

3. Eine Transaktion muß solange warten, bis es eine erforderliche Sperre entsprechend der Verträglichkeitstabelle erhalten kann.

4. Jede Transaktion durchläuft 2 Phasen:

- in Wachstumsphase werden Sperren angefordert, aber nicht freigegeben- in Schrumpfungsphase werden Sperren freigegeben, aber nicht angefordert

5. Bei EOT (Transaktionsende) muß eine Transaktion alle ihre Sperren zurückgeben.

Page 13: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Beispiel für 2PL-Verzahnung

T1 T2

BOTlockX(A)read(A)write(A)

BOTlockS(A) T2 muß warten

lockX(B)read(B)unlockX(A) T2 wecken

read(A)lockS(B) T2 muß warten

write(B)unlock(B) T2 wecken

read(B)commit

unlockS(A)unlockS(B)commit

T1: Modifikation von A und B(z.B. Umbuchung)

T2: Lesen von A und B(z.B. Addieren der Salden)

Page 14: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Verklemmungen (Deadlocks)

Sperrbasierte Synchronisationsmethoden können (unvermeidbar) zu Verklemmungen führen:Gegenseitiges Warten auf Freigabe von Sperren

T1 T2

BOTlockX(A)

BOTlockS(B)read(B)

read(A)write(A)lockX(B) T1 muß auf T2 warten

lockS(A) T2 muß auf T1 warten=> Deadlock

T1: Modifikation von A und B(z.B. Umbuchung)

T2: Lesen von B und A(z.B. Addieren der Salden)

Transaktionen leicht modifiziert:

Page 15: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Strategien zur Erkennung und Vermeidung von Verklemmungen

1. Wartegraph hat Zyklen

T1 T2

T3

w = wartet aufw w

w T4w Nach Erkennen eines Zyklus muß

Verklemmung durch Zurücksetzen einer geeigneten Transaktion beseitigt werden.

2. Preclaiming - Vorabforderung aller SperrenBeginn einer Transaktion erst, nachdem die für diese Transaktion insgesamt erforderlichen Sperren erfolgt sind.Problem: Vorab die erforderlichen Sperren erkennen

3. ZeitstempelTransaktionen werden durch Zeitstempel priorisiert. Zurücksetzen statt Warten, wenn T1 Sperre fordert, T2 aber Sperre erst freigeben muß:

• Strategie Wound-wait: Abbruch von T2, falls T2 jünger als T1, sonst warten

• Strategie Wait-die: Abbruch von T1, wenn T1 jünger als T2, sonst warten

Page 16: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Transaktionen in der J2EE-Architektur

Erleichterung der Anwendungsprogrammierung

Aufsetzen einer Transaktion: Was ist zu tun? Deklaration des Transaktionsanfangs (begin) Ausführung von Ressource-Anfragen und -Updates Deklaration des Transaktionsendes (commit)

Transaktionen können durch Bean oder durch Container aufgesetzt werden

"Aufsetzen" wird auch Demarkation genannt

Page 17: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Wiederholung: Aufruf von Beans

Page 18: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Initialisierungsmethode für Servlet

public class BonusServlet extends HttpServlet { CalcHome homecalc; public void init(ServletConfig config) throws ServletException{ //Look up home interface try{ InitialContext ctx = new InitialContext(); Object objref = ctx.lookup("calcs"); homecalc = (CalcHome)PortableRemoteObject.narrow

(objref, CalcHome.class); ... }}

Page 19: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

doGet Methode

Eingabe: request und response ObjektRequests repräsentieren die Eingabe vom

BrowserResponses repräsentieren einen

Ausgabekanal zum BrowserAufgaben:

Finden des Home-Interfaces des Anwendungsobjekts

Aufruf der Methode calcBonus Generieren des Antwort-HTML-Seite

Page 20: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

doGet Methode (Ausschnitt)

public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String socsec = null; int multiplier = 0; double calc = 0.0; PrintWriter out; response.setContentType("text/html"); String title = "EJB Example"; out = response.getWriter(); out.println("<HTML><HEAD><TITLE>) out.println(title); out.println("</TITLE></HEAD><BODY>");

Page 21: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

doGet Methode (Ausschnitt)

try{ Calc theCalculation;

//Retrieve Bonus and Social Security Information String strMult = request.getParameter("MULTIPLIER"); Integer integerMult = new Integer(strMult); multiplier = integerMult.intValue(); socsec = request.getParameter("SOCSEC"); //Calculate bonus double bonus = 100.00; theCalculation = homecalc.create(); calc = theCalculation.calcBonus(multiplier, bonus);} catch(Exception CreateException){ CreateException.printStackTrace();}

Page 22: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

doGet Methode (Ausschnitt)

//Display Data out.println("<H1>Bonus Calculation</H1>"); out.println("<P>Soc Sec: " + socsec); out.println("<P>Multiplier: " + multiplier); out.println("<P>Bonus Amount: " + calc); out.println("</BODY></HTML>"); out.close();}

Page 23: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

CalcHome

package Beans;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBHome;public interface CalcHome extends EJBHome {

Calc create() throws CreateException,

RemoteException;}

Page 24: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Calc Remote Interface

package Beans;import javax.ejb.EJBObject;import java.rmi.RemoteException;public interface Calc extends EJBObject { public double calcBonus(int multiplier, double bonus)

throws RemoteException;}

Page 25: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

CalcBean (Ausschnitt)

public class CalcBean implements SessionBean { public double calcBonus(int multiplier, double bonus) { double calc = (multiplier*bonus); return calc; } ...}

Page 26: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Aufsetzen einer Transaktion durch Bean (1)

import javax.sql.*; import java.sql.*;public class MySessionEJB implements SessionBean { EJBContext ejbContext; public void someMethod (...) { javax.transaction.UserTransaction ut; DataSource ds1, ds2; Connection con1, con2; Statement stmt1, stmt2; InitialContext initCtx = new InitialContext();

Page 27: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Aufsetzen einer Transaktion durch Bean (2) ds1 = (DataSource)initCtx.lookup(...); con1 = ds1.getConnection(); stmt1 = con1.createStatement(); ... ut = ejbContext.getUserTransaction(); ut.begin(); stmt1.executeQuery(...); ... stmt1.executeUpdate(...); ... ut.commit(); ... } ...}

Page 28: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Diskussion

Transaktionen im J2EE-KontextEs wurde in dieser Vorlesung ein grober

Eindruck der Ziele und wesentlichen Ideen vermittelt

Page 29: Realisierung verteilter Anwendungen: Teil 7 zBeim vorigen Mal: yMultitier-Architekturen: Enterprise Java Beans zInhalt heute: yFortsetzung der Einführung

Beim nächsten Mal

Fortsetzung der Behandlung von Transaktionen

... wiederum am praktischen Beispiel von J2EE