Optimistic and Multiversion Concurrency Control
|
|
- Monica Messner
- vor 8 Jahren
- Abrufe
Transkript
1 Optimistic and Multiversion Concurrency Control Am Beispiel PostgreSQL Seminar Datenbanksysteme Master of Science in Engineering Vertiefung Software and Systems HSR Hochschule für Technik Rapperswil Supervisor: Prof. Stefan Keller Autor: Gian Poltéra Rapperswil, Juni 2014 Version: 1.3
2 Zusammenfassung Im Rahmen dieser Seminararbeit wurde in einem ersten Teil das Paper von Momjian [1] studiert und versucht die wesentlichen Punkte verständlich zu erläutern. Dieses Paper befasst sich mit Multiversion Concurrency Control (MVCC) in PostgreSQL. MVCC ist ideal für stark ausgelastete Datenbanken in denen sehr häufig nur gelesen wird. Das Besondere an MVCC ist, dass nie auf ein Datenbankobjekt gewartet werden muss, da verschiedene Versionen eines Objekts gehalten werden. In einem Versuch, die Geschwindigkeit mit und ohne MVCC zu messen, wurde ein erheblich höherer Zeitbedarf bei der Durchführung von Updates mit MVCC festgestellt. Dies ist, neben dem erhöhten Platzbedarf, einer der Nachteile von MVCC. Ergänzt werden die theoretischen Erläuterungen jeweils mit praktischen Beispielen. Im zweiten Teil dieser Seminararbeit wurde versucht, diverse Anomalien gemäss Paper von Berenson et al. [2], in PostgreSQL zu simulieren. Zuerst wurden diese Anomalien theoretisch erläutert und anschliessend wurde für Demo-Zwecke ein kleines Java Programm geschrieben. Es konnten erfolgreich drei Anomalien erzeugt werden. Abstract In a first part of this seminar, the paper written by Momjian [1] has been studied. Key points of the paper have been identified and described in a comprehensible manner. This paper is concerned with multiversion concurrency control (MVCC) in PostgreSQL. MVCC is ideally suited for heavily used databases on which mainly read accesses occur. A special feature of MVCC is that database objects are always immediately ready for access with no delays. This is because different versions of the object are kept in the database at the same time. In an attempt to measure the speed with and without MVCC used, a considerably higher time requirement was detected to perform updates. This is, in addition to the increased space requirement, one of the downsides of MVCC. The theoretical explanations in the paper are each accompanied with practical examples. In the second part of this seminar paper, it was tried to simulate the various anomalies described in the paper of Berenson et al. [2]. This was done by first explaining those anomalies in detail. Afterwards, small demo applications written in Java have been created in order to verify them. From all of the anomalies described, three could be successfully simulated. 2
3 Inhaltsverzeichnis 1 Einführung und Überblick OCC MVCC Vor- und Nachteile von MVCC Geschwindigkeit von MVCC MVCC in PostgreSQL Grundlagen INSERT DELETE UPDATE ROLLBACK Statusmarkierungen Multi-Statement Transaktionen Cleanup Praktischer Teil Grundlagen Dirty Read Nonrepeatable Read Phantom Read Lost Update Read Skew Write Skew Fazit und Ausblick Literaturverzeichnis Abbildungsverzeichnis Tabellenverzeichnis Anhang Planning MSSQL Snapshot Test Documentation Classes Source Code
4 1 Einführung und Überblick 1.1 OCC Beim Optimistic Concurrency Control (OCC) wird allen Benutzern einen parallelen Lesezugriff auf die Datensätze gewährt. Es wird der Benutzer privilegiert, der zuerst einen Datensatz geändert hat. OCC ist vorwiegend für Lesezugriffe geeignet. Beim Pessimistic Concurrency werden beim Zugriff auf ein Objekt, die Schreib- und Lesezugriffe für alle anderen Benutzer gesperrt. 1.2 MVCC Das Multiversion Concurrency Control (MVCC) ist eine Erweiterung von OCC. Es kommt ohne Blockierung und ohne die Konsistenz der Datenbank zu gefährden aus. Dabei muss eine Transaktion nie auf ein Datenbankobjekt warten. Dies wird intern durch die Haltung von verschiedenen Versionen des Objekts gelöst. MVCC ist ideal für stark ausgelastete Datenbanken in denen sehr häufig nur gelesen wird. Die meisten aktuellen Datenbanksysteme, wie PostgreSQL, Oracle, DB2, MySQL InnoDB und MSSQL (optional) unterstützen MVCC [1]. Das Verhalten von MVCC wird mithilfe der Abbildung 1 anhand eines Beispiels erläutert. INSERT CREATE 40 EXPIRE DELETE CREATE 40 EXPIRE 47 UPDATE CREATE 40 EXPIRE 78 CREATE 78 EXPIRE alt (delete) neu (insert) Ein neuer Wert wird in die Datenbank geschrieben. Es wird der Wert der aktuellen Transaktions-ID in CREATE gesetzt. Ein Wert wird aus der Datenbank gelöscht. Der Datensatz bleibt erhalten und die aktuelle Transaktions-ID in EXPIRE gesetzt. Bei einem Update werden zwei Datensätze gehalten. Zuerst wird der Datensatz, analog zum vorherigen Beispiel, als gelöscht markiert, anschliessend wird ein neuer Datensatz erstellt. Die aktuelle Transaktions-ID wird beim alten als EXPIRE und beim neuen als CREATE eingetragen. Abbildung 1: MVCC Verhalten [1] Die Transaktions-ID ist ein Zeitstempel oder eine fortlaufende Transaktions-Nummer: T j mit j = maxarg{ts(t bel ): TS(T bel ) < TS(T i )} (1) bel 4
5 Die MVCC Snapshots kontrollieren welche Datensätze für SQL-Statements sichtbar sind. Ein Snapshot wird je nach Isolationslevel beim Start jedes SQL-Statements (READ COMMITTED) oder beim Transaktionsstart (SERIALIZABLE) erstellt. Die verschiedenen Isolationslevels werden in Kapitel 3.1 genauer beschrieben. Beim Erstellen eines neuen Snapshots werden die höchste Transaktions-ID, die committed wurde, und die aktuell ausgeführten Transaktions-IDs gesammelt. Durch die Information dieser Snapshots weiss das System welche Datensätze für eine Anweisung sichtbar sind. [1] Die Bestimmung mittels Snapshots, ob eine Zeile sichtbar ist, wird mithilfe von Abbildung 2 und Abbildung 3 anhand eines Beispiels erläutert: Ein Snapshot wird erstellt. Die höchste committed Transaktions-ID ist 100, offene Transaktionen sind 25, 50 und 75. Alle anderen Transaktionen wurden committed. Abbildung 2: MVCC Snapshot Zeitleiste [1] Nur CREATE CREATE 30 EXPIRE CREATE 50 EXPIRE CREATE 110 EXPIRE CREATE & EXPIRE CREATE 30 EXPIRE 80 CREATE 30 EXPIRE 75 CREATE 30 EXPIRE 110 Sichtbar Unsichtbar Unsichtbar Unsichtbar Sichtbar Sichtbar Verschiedene Transaktionen schreiben einen neuen Wert in die Datenbank. Der erste Datensatz ist sichtbar, die Transaktion 30 ist weder offen noch grösser als der höchste committed Wert. Der zweite Datensatz ist nicht sichtbar, weil die Transaktion 50 noch offen ist. Der letzte Datensatz ist nicht sichtbar, weil die Transaktion 110 höher ist als der höchste committed Wert. Verschiedene Transaktionen ändern den Datensatz mit CREATE 30. Der erste Datensatz ist unsichtbar weil die Transaktion 80 nicht offen und kleiner als der höchste committed Wert ist. Dieser Datensatz ist somit abgelaufen. Der zweite Datensatz ist noch sichtbar da die Transaktion 75 noch offen ist. Der letzte Datensatz ist sichtbar weil die Transaktion 110 höher als der höchste committed Wert ist. Abbildung 3: MVCC Snapshots Zeilensichtbarkeit [1] 5
6 1.3 Vor- und Nachteile von MVCC Der grosse Vorteil von MVCC ist einerseits, dass Leser nie die Schreiber blockieren und anderseits Schreiber nie die Leser blockieren. Lesen ist dabei jederzeit und ohne zu warten möglich. Der grosse Nachteil ist die sehr speicherintensive Haltung von mehreren Datensatzversionen. Dies benötigt nicht nur einen grösseren Speicherplatz, sondern auch mehr Zeit bei Updates. Ein weiterer Nachteil ist die zwingend notwendige Wartung bzw. das Aufräumen, welches zwischendurch notwendig ist. Als letzte kleine Einschränkung ist zu erwähnen, dass die Transaktions-ID in PostgreSQL nur 32 Bit gross sein kann, das heisst: 4 Milliarden Transaktionen sind möglich, anschliessend beginnt die Zählung wieder bei null. 1.4 Geschwindigkeit von MVCC Da sich MVCC bei PostgreSQL nicht deaktivieren lässt und keine Referenzen im Internet vorhanden sind, wurde eine eigene kleine Testumgebung aufgebaut. Ziel war es, ein Bild davon zu erhalten, wie sich MVCC auf die Lese- und Schreibgeschwindigkeit auswirkt. Microsoft MS SQL bietet eine ähnliche Funktion wie MVCC diese lässt sich jedoch ein- und ausschalten: ALTER DATABASE Datenbankname SET READ_COMMITTED_SNAPSHOT ON; Die folgenden Werte wurden durch das Einfügen bzw. Löschen einfacher Einträge gemessen. Das Einfügen und Löschen wurde bewusst einzeln in einer Schleife durchgeführt um realistischere Werte zu erhalten. Die Testumgebung und die SQL-Skripts sind im Anhang unter 8.2 aufgeführt. Anzahl Einträge INSERT SELECT UPDATE DELETE ON OFF ON OFF ON OFF ON OFF :20 00:30 00:00 00:00 00:18 00:02 00:16 00: :33 04:25 00:04 00:03 03:17 00:09 03:04 03: :40 00:34-01: Tabelle 1: Messresultate MSSQL READ_COMMITED_SNAPSHOT ON/OFF 6
7 Die Grafische Ansicht der erhaltenen Resultate sind in Abbildung 4 bis Abbildung 7 abgebildet. Fehlende Werte wurden hochgerechnet und die Linien wurden interpoliert. Die X-Achse entspricht jeweils der Anzahl Einträge und die Y-Achse entspricht der benötigten Zeit in Sekunden. Abbildung 4: Messresultate INSERT Abbildung 5: Messresultate SELECT Abbildung 6: Messresultate UPDATE Abbildung 7: Messresultate DELETE Die Geschwindigkeitsunterschiede bei INSERT, SELECT und DELETE sind nicht gravierend ausgefallen. Beim UPDATE braucht die Variante mit MVCC rund 20-mal länger. In der Praxis wäre der Unterschied insbesondere beim SELECT erheblich grösser gewesen, da bei gleichzeitigen Schreib- und Leseoperationen die Leser, durch die Aktivierung von MVCC, nie blockiert werden. Denn erst bei parallelen Transaktionen kommt MVCC voll zum Tragen. Je nach Konstellation ist MVCC beim SELECT erheblich schneller. Auf das Testen mit parallelen Transaktionen wurde an dieser Stelle verzichtet, da es sehr viele mögliche Kombinationen gibt und diese von Anwendung zu Anwendung unterschiedlich sind. 7
8 2 MVCC in PostgreSQL 2.1 Grundlagen Jede Transaktion in PostgreSQL erhält eine eigene Transaktions-ID namens xid. Zum Anzeigen der aktuell verwendeten xid s einer Tabelle müssen diese explizit in der SELECT-Query angegeben werden. Ein blosses setzten des * Operators reicht dabei nicht aus. Nachfolgend werden die wichtigsten Befehle für PostgreSQL und MVCC erläutert. Diese sind für das Verständnis dieser Arbeit erforderlich. Auf eine Beschreibung der Grundlegenden SQL- Funktionen wird an dieser Stelle verzichtet und auf entsprechende Fachliteratur verwiesen [3]. Befehl SELECT xmin SELECT xmax SELECT cmin SELECT cmax SELECT txid_current() BEGIN TRANSACTION ROLLBACK TRANSACTION COMMIT TRANSACTION Erläuterung Transaktions-ID für CREATE, wird erstellt bei einem INSERT oder UPDATE. Transaktions-ID für EXPIRE, wird ergänzt bei einen UPDATE oder DELETE. Systembefehle-ID, entspricht der Position in der ein Befehl innerhalb einer Transaktion ausgeführt wurde. Gibt die aktuelle txid zurück. Beginn einer neuen Transaktion. Rückgängig machen aller bisherigen UPDATE und DELETE Befehle innerhalb einer Transaktion. Definitiver Abschluss einer Transaktion. Tabelle 2: Befehle PostgreSQL und MVCC 8
9 Die nachfolgenden Beispiele für INSERT, DELETE, UPDATE und ROLLBACK wurden vom Paper von Momjian [1] abgeleitet und die Testdaten bzw. das entsprechende SQL-Script sind auf seiner Webseite [4] verfügbar. Zur eigentlichen Testtabelle mvcc_demo wird noch eine VIEW mvcc_demo_page0 erstellt, welche die Snapshot Datensätze anzeigt. 2.2 INSERT Beim Einfügen von neuen Objekten wird eine fortlaufende xid zu jedem Objekt erstellt und als xmin eingetragen. Im nachfolgenden Beispiel wurden alle Objekte in einer Transaktion eingefügt und verfügen deshalb über die gleiche xid. Werden diese Objekte jeweils in einer separaten Transaktion eingefügt, hat jedes Objekt eine eigene xid. INSERT INTO mvcc_demo VALUES (10), (20), (30), (40), (50); SELECT xmin, xmax, val FROM mvcc_demo; SELECT * FROM mvcc_demo_page0; Abbildung 8: PostgreSQL INSERT 2.3 DELETE Wird ein Objekt gelöscht, ist es in der normalen Abfrage nicht mehr sichtbar. Auf der rechten Seite ist ersichtlich, dass das Objekt jedoch weiterhin vorhanden ist und lediglich der Wert xmax mit der aktuellen xid der Query eingetragen wurde. DELETE FROM mvcc_demo WHERE val = 20; SELECT xmin, xmax, val FROM mvcc_demo; SELECT * FROM mvcc_demo_page0; Abbildung 9: PostgreSQL DELETE 9
10 2.4 UPDATE Bei einem Update eines Datensatzes wird der alte Wert mit xmax ergänzt und ein neues Objekt mit der aktuellen xid erstellt. Auf der rechten Seite ist ersichtlich, dass bei einem Update ein neues Objekt erstellt wurde. UPDATE mvcc_demo SET val = val + 1 WHERE val = 10; SELECT xmin, xmax, val FROM mvcc_demo; SELECT * FROM mvcc_demo_page0; Abbildung 10: PostgreSQL UPDATE 2.5 ROLLBACK Mit dem Befehl Rollback kann eine laufende Transaktion rückgängig gemacht werden. Dies ist jedoch nur innerhalb einer Transaktion und bevor committed wurde möglich. Auf der rechten Seite ist ersichtlich, dass beim Rollback der Datensatz, wie beim Löschen, markiert wurde. Beim normalen Abrufen der Tabelle ist er jedoch weiterhin vorhanden. BEGIN WORK; DELETE FROM mvcc_demo WHERE val = 30; ROLLBACK WORK; SELECT xmin, xmax, val FROM mvcc_demo; SELECT * FROM mvcc_demo_page0; Abbildung 11: PostgreSQL ROLLBACK 10
11 2.6 Statusmarkierungen Damit ein Rollback wie in Kapitel 2.5 funktioniert, benötigt es ein zusätzliches System, das die Transaktionen mit Statusinformationen markiert. Die Abbildung 12 zeigt das pg_clog von PostgreSQL, dabei wird jede Transaktion xid durch einen Status ergänzt. Es sind drei verschiedene Statusmarkierungen möglich, diese sind: laufend, abgebrochen und committed. Ein Rollback markiert die Transaktions-ID somit als abgebrochen und alle anderen Sessions ignorieren diese Transaktion. Es sind keine weiteren Anpassungen in den Datensätzen oder den Snapshots notwendig. [1] Abbildung 12: PostgreSQL Statusmarkierungen [1] 2.7 Multi-Statement Transaktionen Multi-Statement Transaktionen sind Transaktionen in denen mehrere Befehle ausgeführt werden. Weil jedes Statement seine eigenen Sichtbarkeitsregeln hat, benötigen Multi-Statement Transaktionen ein zusätzliches Tracking. Der Inhalt eines Cursors zum Beispiel muss unverändert bleiben, auch wenn spätere Befehle in derselben Transaktion Datensätze modifizieren. So ein Tracking ist in PostgreSQL durch die Systembefehle-IDs cmin und cmax implementiert, diese werden intern jedoch nur in einer einzelnen Spalte gehalten. Deshalb ist es unmöglich den Status eines Datensatzes, der innerhalb einer Multi-Statement Transaktion erstellt und wieder gelöscht wurde, aufzuzeichnen. In diesem Fall wird in PostgreSQL eine spezielle Combo-Command-ID erzeugt, welche sich auf den lokalen Memory Hash, der den Inhalt der aktuellen cmin und cmax Werte enthält, referenziert. [1] 11
12 Nachfolgend ein Beispiel wie die Ausgabe in PostgreSQL aussieht. Im Paper von Momjian [1] sind viele weitere Beispiele aufgeführt. Der Wert von cmin entspricht der Position innerhalb der Transaktion, an der der INSERT-Befehl ausgeführt wurde. BEGIN WORK; INSERT INTO mvcc_demo VALUES (10); INSERT INTO mvcc_demo VALUES (20); INSERT INTO mvcc_demo VALUES (30); COMMIT WORK; BEGIN WORK; INSERT INTO mvcc_demo VALUES (10), (20), (30); INSERT INTO mvcc_demo VALUES (60), (50), (40); COMMIT WORK; BEGIN WORK; INSERT INTO mvcc_demo VALUES (60); INSERT INTO mvcc_demo VALUES (50); INSERT INTO mvcc_demo VALUES (40); COMMIT WORK; SELECT xmin, cmin, val FROM mvcc_demo; SELECT xmin, cmin, val FROM mvcc_demo; Abbildung 13: PostgreSQL Multi-Statement Transaktion 2.8 Cleanup Da PostgreSQL bei einem UPDATE oder DELETE Befehl einen Datensatz nicht physikalisch löscht, wird jedes Mal eine zweite Version angelegt bzw. die alte als gelöscht markiert. Diese müssen solange beibehalten werden bis andere Transaktionen diese Zeilenversion nicht mehr sehen können. Wird eine Tabelle stark durch UPDATE oder DELETE Befehle ausgelastet, steigt der tote Speicherplatz stark an. Dagegen hilft der Befehl VACUUM, der bei PostgreSQL seit der Einführung von MVCC zur Verfügung steht. Dieser funktioniert wie eine Art Staubsauger und defragmentiert dabei den Heap. Damit man diese Arbeit nicht jedes Mal von Hand erledigen muss, gibt es die Funktion AUTOVACUUM. Des Weiteren führt PostgreSQL beim Aufruf eines SELECT, UPDATE und DELETE Befehls bei Bedarf eine Bereinigung einer einzelnen Heap Page durch. [5], [1] Cleanup Methode Single- Page VACUUM Ausgelöst durch SELECT, UPDATE, DELETE VACUUM, AUTOVACUUM Anwendungsbereich Wiederverwendung Heap Tuples? Non-HOT Item State HOT Item State Clean Indexes? Update FSM? Einzelne Heap Page Ja Tot Unbenutzt Nein Nein Alle potenziellen Heap Pages Ja Unbenutzt Unbenutzt Ja Ja Tabelle 3: PostgreSQL Cleanup Zusammenfassung [1] In Tabelle 3 werden in einer Zusammenfassung die beiden Cleanup Methoden beschrieben. 12
13 Der Aufbau einer Heap Page ist in der Abbildung 14 aufgezeichnet. Die Heap Page besteht aus dem Page Header, Items und Tupel. Der Item Pointer zeigt von einem Item zu einem Tupel. Beim Aufruf von SELECT, UPDATE und DELETE wird nur die Heap Page bereinigt. Durch VACUUM werden zusätzlich auch die Indexe bereinigt, die auf die einzelnen Tupel zeigen. Abbildung 14: PostgreSQL Aufbau Heap Page und Indexe [1] Nachfolgend einen kurzen Überblick über die Befehle für das Aufräumen in PostgreSQL: Befehl TRUNCATE VACUUM AUTOVACUUM VACUUM VERBOSE CREATE INDEX REINDEX TABLE VACUUM FULL Erläuterung Leert eine Tabelle, ist schneller als DELETE da keine Bedingungen definiert werden können. Kann nicht zurückgerollt werden. Manuelles VACUUM Führt ein automatisches VACUUM durch und muss in der Datei PostgreSQLql.conf aktiviert werden: autovacuum = on. Ausgabe des Status der Free Space Map Erstellt ein Index für eine Tabelle Reorganisation des Tabellenindexes Verkleinert die Tabellendatei auf ein Minimum, benötigt jedoch eine exklusive Tabellen-Sperre. Nicht für die tägliche Wartung. Falls jedoch trotzdem notwendig, zuerst VACUUM FULL und anschliessend REINDEX, insbesondere bei älteren PostgreSQL Versionen, notwendig. Tabelle 4: PostgreSQL Cleanup Befehle 13
14 3 Praktischer Teil Ziel dieses Abschnittes war es, einige Anomalien in PostgreSQL zu simulieren. Dafür wurde ein kleines Java Programm geschrieben und versucht, die einzelnen Anomalien zu erzeugen. Die Anomalien über Skew wurden dabei nicht weiter verfolgt. Die technische Umsetzung und Dokumentation des praktischen Teiles sind im Anhang beschrieben. 3.1 Grundlagen Zunächst folgt eine Auflistung der häufigsten und bekanntesten Anomalien und deren Erläuterung. Die theoretischen Ansätze basieren auf dem Dokument von Berenson et al. [2]. Das Isolation Level und die jeweils möglichen Anomalien: Isolation Level Dirty Read Lost Updates Nonrepeatable Read Phantom Read Read uncommitted Möglich Möglich Möglich Möglich Read committed Unmöglich Möglich Möglich Möglich Repeatable read Unmöglich Unmöglich Unmöglich Möglich Serializable Unmöglich Unmöglich Unmöglich Unmöglich Tabelle 5: ANSI SQL Isolation Levels [2] Die Isolation Level und Anomalien bei Systemen mit MVCC: Isolation Level Dirty Read Nonrepeatable Read Phantom Read Lost Updates Read committed Unmöglich Möglich Möglich Möglich Repeatable read Unmöglich Unmöglich Unmöglich Möglich Serializable Unmöglich Unmöglich Unmöglich Unmöglich Tabelle 6: MVCC Isolation Levels [6] In PostgreSQL ist MVCC nicht deaktivierbar. Das Isolation Level kann jedoch folgendermassen angepasst werden: SET TRANSACTION ISOLATION LEVEL ISOLATION LEVEL ; Dieser Befehl muss jeweils am Anfang der Transaktion angegeben werden und kann nach der ersten Query nicht mehr geändert werden. PostgreSQL verwendet den Standardwert READ COM- MITTED. In der Tabelle 6 ist ersichtlich, dass bei Systemen mit MVCC das Isolation Level READ UNCOMMITTED gar nicht notwendig ist. PostgreSQL unterstützt dieses Level jedoch ebenfalls, dabei wird es intern einfach auf den Standardwert gesetzt. [6] 14
15 Durch die Serializable Snapshot Isolation (SSI) Technik, die in PostgreSQL dem Isolation Level SERIALIZABLE entspricht, wird sichergestellt, dass bei jeder möglichen Kombination von seriellen Zugriffen jederzeit das Richtige gemacht wird. Falls notwendig wird automatisch ein Rollback mit einem serialization Fehler durchgeführt. [7] 3.2 Dirty Read Andere Transaktionen können Daten der aktuellen Transaktion lesen, obwohl die Änderungen noch nicht committed wurden Zeitpunkt Transaktion T 1 Transaktion T 2 1 READ x 2 UPDATE x 3 READ x 4 ROLLBACK Tabelle 7: Dirty Read 1. Transaktion T 1 liest einen Datensatz. 2. Transaktion T 2 editiert den Datensatz. 3. T 1 liest den Datensatz bevor T 2 einen COMMIT oder ROLLBACK durchführt. 4. T 2 führt einen ROLLBACK durch. 5. T 1 hat einen Datensatz gelesen der nie committed wurde und so nie wirklich existiert hat. 3.3 Nonrepeatable Read Bei mehrfachen, gleichen Lesezugriffen innerhalb einer Transaktion gibt es unterschiedliche Ergebnisse. Zeitpunkt Transaktion T 1 Transaktion T 2 1 READ x 2 UPDATE x 3 COMMIT 4 READ x Tabelle 8: Nonrepeatable Read 1. Transaktion T 1 liest einen Datensatz. 2. Transaktion T 2 editiert den Datensatz. 3. T 2 führt ein COMMIT durch. 4. T 1 liest den Datensatz erneut. 5. T 1 erhält einen modifizerten Wert oder stellt fest, dass der Datensatz gelöscht wurde. 15
16 3.4 Phantom Read Durch das Einfügen, Ändern oder Löschen gibt es in anderen Transaktionen bei gleichen Bedingungen unterschiedliche Ergebnisse. Zeitpunkt Transaktion T 1 Transaktion T 2 1 READ 2 INSERT 3 COMMIT 4 READ Tabelle 9: Phantom Read 1. Transaktion T 1 liest eine Datensatzmenge, z.b. die Zeilenanzahl. 2. Transaktion T 2 fügt einen neuen Datensatz ein. 3. T 2 führt ein COMMIT durch. 4. T 1 liest die Datensatzmenge erneut. 5. T 1 erhält eine unterschiedliche Datensatzmenge im Vergleich zur ersten Abfrage. 3.5 Lost Update Durch das Aktualisieren des gleichen Datensatzes durch zwei verschiedene Transaktionen geht ein Update verloren. Zeitpunkt Transaktion T 1 Transaktion T 2 1 READ x 2 READ x 3 UPDATE x 4 UPDATE x 5 COMMIT 6 COMMIT Tabelle 10: Lost Update 1. Transaktion T 1 liest einen Datensatz x. 2. Transaktion T 2 liest ebenfalls den Datensatz x. 3. T 1 editiert den Datensatz x. 4. T 2 editiert ebenfalls den Datensatz x. 5. T 1 führt ein COMMIT durch. 6. T 2 führt ein COMMIT durch. 7. Es wird nur die Änderung von T 2 in der Datenbank gespeichert, die Änderung von T 1 geht verloren. 16
17 3.6 Read Skew Durch das Lesen und gleichzeitige Ändern von abhängigen Datensätzen werden inkonsistente Ergebnisse ausgegeben. Zeitpunkt Transaktion T 1 Transaktion T 2 1 READ x 2 UPDATE x, y 3 COMMIT 4 READ y Tabelle 11: Read Skew 1. Transaktion T 1 liest einen Datensatz x. 2. Transaktion T 2 editiert den Datensatz x und einen Datensatz y, diese haben eine Abhängigkeit. 3. T 2 führt ein COMMIT durch. 4. Transaktion T 1 liest den Datensatz y. 5. T 1 sieht einen inkonsistenten Zustand. Beispiel: Eine Tabelle enthält Informationen über Personen. Alle Personeneinträge haben ein Attribut, das angibt, ob eine Person verheiratet ist oder nicht und ein zweites Attribut, das angibt, ob eine Person tot ist oder nicht. Wir nehmen an, dass x und y jeweils Personeneinträge sind und sie miteinander verheiratet sind. Transaktion T 2 markiert x als eine tote Person und Person y als Witwe. Transaktion T 1 hat einen inkonsistenten Zustand gelesen und sieht, dass Person y eine Witwe ist, aber ihr Mann x lebt. [8] 17
18 3.7 Write Skew Durch das gleichzeitige Ändern von gleichen, abhängigen Datensätzen wird die Datenbank inkonsistent und Abhängigkeiten werden verletzt. Zeitpunkt Transaktion T 1 Transaktion T 2 1 READ x, y 2 READ x, y 3 UPDATE x 4 COMMIT 5 UPDATE y 6 COMMIT Tabelle 12: Write Skew 1. Transaktion T 1 liest die Datensätze x und y, diese haben eine Abhängigkeit. 2. Transaktion T 2 liest ebenfalls die Datensätze x und y. 3. T 2 editiert den Datensatz x. 4. T 2 führt ein COMMIT durch. 5. T 1 editiert den Datensatz y. 6. T 1 führt ein COMMIT durch. 7. Die Abhängigkeit zwischen x und y wurde verletzt. Beispiel: Eine Tabelle enthält Informationen über Personen. Alle Personeneinträge haben ein Attribut, das angibt, ob eine Person verheiratet ist oder nicht und ein zweites Attribut, das angibt, ob eine Person tot ist oder nicht. Wir nehmen an, dass x und y jeweils Personeneinträge sind und sie miteinander verheiratet sind. Transaktion T 2 markiert x als eine tote Person und Transaktion T 1 markiert y als Witwe. In diesem Fall ist die Datenbank inkonsistent bis die Transaktion T 1 committed wurde. [8] Die beiden Anomalien Read und Write Skew werden in dieser Arbeit nicht weiter verfolgt. 18
19 4 Fazit und Ausblick MVCC eignet sich hervorragend für sehr viele Lesezugriffe und wenig Schreiboperationen. Durch die Haltung von verschiedenen Versionen eines Datensatzes kann dieser jederzeit gelesen werden. Die Geschwindigkeit ist jedoch, insbesondere beim Aktualisieren, rund 20-mal langsamer. Weitere Nachteile von MVCC sind der erhöhte Speicherplatzbedarf und der Wartungsaufwand. Durch ein geeignetes Wartungskonzept kann die Datenbankgrösse reduziert werden. Das Schreiben der Snapshots auf die physische Harddisk kann auch komplett deaktiviert werden. Dadurch ist PostgreSQL bei einem Serverabsturz jedoch nicht mehr in der Lage, einen konsistenten Zustand der Datenbank zu garantieren. Ob eine relationale Datenbank mit der Funktionalität von MVCC gewählt werden soll, hängt sehr stark von den Anforderungen ab. Die meisten bekannten Hersteller setzten bereits auf dieses Konzept oder bieten es zumindest als Option an. Im praktischen Teil konnten die Anomalien Dirty Read, Nonrepeatable Read, Phantom Read und Lost Update erfolgreich in einem Java Programm umgesetzt werden. Dieses kleine Demo Programm zeigt dabei jeweils auf, wie sich die Werte bei verschiedenen Isolation Levels ändern. Bei der Anomalie Dirty Read konnte kein Fehler generiert werden. Dies ist auf die fehlende Anfälligkeit von MVCC-Systemen auf diese Anomalie zurückzuführen (Tabelle 6) und wurde bereits im Vorfeld so angenommen. In PostgreSQL kann das Isolation Level sehr einfach, am Anfang einer Transaktion angepasst werden. Je höher das Isolation Level gewählt wird, desto weniger Anomalien sind möglich. Dabei werden jedoch auch die Restriktionen erhöht und gleichzeitig schreibende Transaktionen können sich blockieren. Mit dem von PostgreSQL verwendeten Standardwert sind Anomalien zwar möglich. Dieser Wert scheint hinsichtlich Performance und Komplexität gut gewählt und kann bei Bedarf angepasst werden. Das Konzept für MVCC wurde schon 1978 durch Reed [9] bzw durch Bernstein und Goodman [10] entwickelt. Während einige Hersteller wie Oracle diese Technologie bereits 1984 eingeführt haben, dauerte es bei Microsoft bis zum Jahre Bei PostgreSQL ist MVCC seit der Version 6.5 aus dem Jahre 1999 fester Bestandteil. Neue Technologien die das bewährte MVCC in relationalen Datenbanken ablösen scheinen in naher Zukunft keine zu erscheinen. Die aktuellen Trends gehen eher weg von relationalen Datenbanken hin zu Datenbanken, die einen nicht-relationalen Ansatz verfolgen. Einige dieser Datenbanken mit dem sogenannten NoSQL- Ansatz, wie Beispielsweise CouchDB und MongoDB, verwenden jedoch auch wiederum MVCC. 19
20 5 Literaturverzeichnis [1] B. Momjian, MVCC Unmasked, Pennsylvania, [2] H. Berenson, P. Bernstein, J. Gray, J. Melton, E. O'Neil und P. O'Neil, A critique of ANSI SQL isolation levels, Microsoft Corporation, Redmond, [3] K. Douglas und D. Susan, PostgreSQL: a comprehensive guide to building, programming, and administering PostgresSQL databases, SAMS publishing, [4] B. Momjian, SQL Script, [Online]. Available: [Zugriff am 15 März 2014]. [5] B. Helmle, VACUUM FULL, [Online]. Available: [Zugriff am 25 März 2014]. [6] PostgreSQL, Transaction Isolation, [Online]. Available: [Zugriff am 05 Mai 2014]. [7] PostgreSQL, SSI, [Online]. Available: [Zugriff am 29 Mai 2014]. [8] L. Frank, Countermeasures against isolation anomalies, Department of Informatics Copenhagen Business School, Copenhagen, [9] R. David P., Naming and synchronization in a decentralized computer system, Massachusetts Institute of Technology, Cambridge, [10] P. A. Bernstein und N. Goodman, Concurrency control in distributed database systems, (CSUR), ACM Computing Surveys, pp ,
21 6 Abbildungsverzeichnis Abbildung 1: MVCC Verhalten [1]... 4 Abbildung 2: MVCC Snapshot Zeitleiste [1]... 5 Abbildung 3: MVCC Snapshots Zeilensichtbarkeit [1]... 5 Abbildung 4: Messresultate INSERT... 7 Abbildung 5: Messresultate SELECT... 7 Abbildung 6: Messresultate UPDATE... 7 Abbildung 7: Messresultate DELETE... 7 Abbildung 8: PostgreSQL INSERT... 9 Abbildung 9: PostgreSQL DELETE... 9 Abbildung 10: PostgreSQL UPDATE Abbildung 11: PostgreSQL ROLLBACK Abbildung 12: PostgreSQL Statusmarkierungen [1] Abbildung 13: PostgreSQL Multi-Statement Transaktion Abbildung 14: PostgreSQL Aufbau Heap Page und Indexe [1] Tabellenverzeichnis Tabelle 1: Messresultate MSSQL READ_COMMITED_SNAPSHOT ON/OFF... 6 Tabelle 2: Befehle PostgreSQL und MVCC... 8 Tabelle 3: PostgreSQL Cleanup Zusammenfassung [1] Tabelle 4: PostgreSQL Cleanup Befehle Tabelle 5: ANSI SQL Isolation Levels [2] Tabelle 6: MVCC Isolation Levels [6] Tabelle 7: Dirty Read Tabelle 8: Nonrepeatable Read Tabelle 9: Phantom Read Tabelle 10: Lost Update Tabelle 11: Read Skew Tabelle 12: Write Skew
22 8 Anhang 8.1 Planning Milestones Distribution of tasks Kickoff Meeting Delivery task Interim presentation Final practical part Final presentation 22
23 8.2 MSSQL Snapshot Test SQL-Scripts: INSERT 1 ALTER DATABASE test SET READ_COMMITTED_SNAPSHOT ON; 2 CREATE TABLE test (id int IDENTITY(1,1)PRIMARY KEY CLUSTERED, value int); 3 4 integer, integer; begin 11 INSERT INTO test (value) VALUES (1); end SELECT: 1 integer, integer, integer; begin 10 + (SELECT value FROM test WHERE id=1); end UPDATE: 1 integer, integer; begin 8 UPDATE test SET value=2 WHERE id=1; 9 10 end 23
24 DELETE: 1 integer, integer; begin 7 DELETE FROM test WHERE id=@rc; 8 9 end Test Environment: Type Value VM-Player VMware Player Operating System MS Windows 7 64 Bit Service Pack 1 Assigned CPU 4 Processor Cores from Intel 3.50 GHz Assigned RAM 8 GB Assigned HDD 60 GB SATA SQL-Version MS SQL Server 2008 R2 Express 64 Bit with Mgmt 8.3 Documentation Requirements: An installation of PostgreSQLQL on the local host or on a remote system. PostgreSQLQL JDBC Driver Version Library, is included in the JAR-File. Adapting at the firewall on local host or the remote system, PostgreSQL standard port is Editing the Pg_hba.conf File for access outside the local host and restart PostgreSQL. o Example: host all all /24 md5 host all all /24 md5 Creating a new database with name Practices and user/password PostgreSQL. User Guide: Editing the BasicParameters in the DBConnection.java: DB_URL_POSTGRESQL_PREFIX for example: jdbc:postgresqlql:// :5432/practices DB_POSTGRESQL_USER for example: PostgreSQL DB_POSTGRESQL_PASSWORD for example: PostgreSQL 24
25 Run the DBSeminar.java the output in the console looks like this: Start Nonrepeatable Read with READ COMMITTED T1 begin work T1 read the sum -> 330 T2 begin work T2 update a value, sum -> 311 T2 commit T1 read the sum -> 311 T1 commit FAILURE: NonRepeateableRead Start Nonrepeatable Read with REPEATABLE READ T1 begin work T1 read the sum -> 330 T2 begin work T2 update a value, sum -> 311 T2 commit T1 read the sum -> 330 T1 commit OK: No NonRepeateableRead Start LostUpdate with REPEATABLE READ T1 begin work T2 begin work T1 read the first value -> 10 T2 read the first value -> 10 T1 update first value, from 10 to 110 T2 update first value, from 10 to 5 T1 commit T2 commit Update failed OK: No LostUpdate, Value in DB ->
26 The demo makes per default the following tests, you can easy adapt this by editing the code in the DBSeminar.java File. Test Isolationlevel Output DirtyRead 1, READ UNCOMMITTED Always OK (MVCC) NonRepeateableRead1 2, READ COMMITTED FAILURE NonRepeateableRead2 3, REPEATABLE READ OK PhantomRead1 2, READ COMMITTED FAILURE PhantomRead2 3, REPEATABLE READ OK LostUpdate1 2, READ COMMITTED FAILURE LostUpdate2 3, REPEATABLE READ OK, Second Update failed 8.4 Classes Class DBSeminar DBConnection DBHelper Package anomalies Description Main class, starts the anomalies Class for the database connection Helper Class with many methods for accessing table Contains the four anomalies classes 8.5 Source Code This code is hardcoded and only for demonstration purposes, it is therefore not very nice. The source code of the project is also available on the internet under: Class DBSeminar 1 public class DBSeminar { 2 3 private static final String LEVEL1 = "READ UNCOMMITTED"; 4 private static final String LEVEL2 = "READ COMMITTED"; 5 private static final String LEVEL3 = "REPEATABLE READ"; 6 private static final String LEVEL4 = "SERIALIZABLE"; 7 8 /** 9 args the command line arguments 10 */ 11 public static void main(string[] args) throws SQLException { 12 startdirtyread(); //starts the DirtyRead Demo 13 startnonrepeateableread(); //starts the startnonrepeateableread Demo 14 startphantomread(); //starts the PhantomRead Demo 15 startlostupdate(); //starts the LostUpdate Demo 16 } private static void startdirtyread() throws SQLException { 19 //Dirty Read 20 System.out.println("Start DirtyRead with " + LEVEL1); 21 System.out.println(" "); 22 new DirtyRead().dirtyRead(LEVEL1); 23 System.out.println("\n \n"); 24 } private static void startnonrepeateableread() throws SQLException { 26
27 27 //Nonrepeatable Read 1 28 System.out.println("Start Nonrepeatable Read with " + LEVEL2); 29 System.out.println(" "); 30 new NonRepeateableRead().nonRepeateableRead(LEVEL2); 31 System.out.println("\n \n"); //Nonrepeatable Read 2 34 System.out.println("Start Nonrepeatable Read with " + LEVEL3); 35 System.out.println(" "); 36 new NonRepeateableRead().nonRepeateableRead(LEVEL3); 37 System.out.println("\n \n"); 38 } private static void startphantomread() throws SQLException { 41 //PhantomRead 1 42 System.out.println("Start PhantomRead with " + LEVEL2); 43 System.out.println(" "); 44 new PhantomRead().phantomRead(LEVEL2); 45 System.out.println("\n \n"); //PhantomRead 2 48 System.out.println("Start PhantomRead with " + LEVEL3); 49 System.out.println(" "); 50 new PhantomRead().phantomRead(LEVEL3); 51 System.out.println("\n \n"); 52 } private static void startlostupdate() throws SQLException { 55 //LostUpdate 1 56 System.out.println("Start LostUpdate with " + LEVEL2); 57 System.out.println(" "); 58 new LostUpdate().lostUpdate(LEVEL2); 59 System.out.println("\n \n"); //LostUpdate 2 62 System.out.println("Start LostUpdate with " + LEVEL3); 63 System.out.println(" "); 64 new LostUpdate().lostUpdate(LEVEL3); 65 System.out.println("\n \n"); 66 } 67 } Class DBConnection 1 public class DBConnection { 2 3 private static final String DB_POSTGRESQL_DRIVER = "org.postgresqlql.driver"; //PostgreSQL Driver 4 private static final String DB_URL_POSTGRESQL_PREFIX = "jdbc:postgresqlql:// :5432/practices"; //URL to the PostgreSQL Server (Localhost or Remote) 5 private static final String DB_POSTGRESQL_USER = "PostgreSQL"; //DB username 6 private static final String DB_POSTGRESQL_PASSWORD = "PostgreSQL"; //DB password 7 private static final boolean LOG_ON = false; //Acitvates the extended Logging 8 9 public Connection connect() { //Extended log-output if enabled 12 if(log_on) { DriverManager.setLogWriter( new PrintWriter( System.out ) ); } //Verify that the PostgreSQL driver ist inlucded in the library 15 try { 16 Class.forName(DB_POSTGRESQL_DRIVER); 17 } catch (ClassNotFoundException e) { 18 System.out.println("PostgreSQLQL JDBC Driver not found, include in your library"); 19 } Connection connection = null; //Connecetion to the database 24 try { 25 connection = DriverManager.getConnection(DB_URL_POSTGRESQL_PREFIX, 27
28 DB_POSTGRESQL_USER, DB_POSTGRESQL_PASSWORD); 26 } catch (SQLException e) { 27 System.out.println("Connection failed, check Firewall, Adress, Port, Username and Password"); 28 } if (connection!= null) { 31 //System.out.println("Connected to the database"); 32 } else { 33 System.out.println("Connection failed"); 34 } return connection; 37 } 38 } Class DBHelper 1 public class DBHelper { 2 3 private static final String TABLENAME = "testdata"; //name of the created table 4 5 private static final String QUERYCREATETABLE = "DROP TABLE IF EXISTS " + TABLENAME + ";\n" 6 + "CREATE TABLE " + TABLENAME + " (id INT, value INT);\n" 7 + "INSERT INTO " + TABLENAME + " (id, value) VALUES (1,10), (2,20), (3,100), (4,200);\n"; 8 9 //drop the old table and create a new table 10 public static void createtable(connection connection) { 11 PreparedStatement ps = null; 12 try { 13 ps = connection.preparestatement(querycreatetable); 14 ps.executeupdate(); 15 ps.close(); 16 } catch (SQLException ex) { 17 System.out.println("Table creation failed"); 18 } 19 } //begin the transaction 22 public static void begintransaction(connection connection) { 23 try { 24 connection.createstatement().executeupdate("begin TRANSACTION;"); 25 } catch (SQLException ex) { 26 System.out.println("Begin transaction failed"); 27 } 28 } //commits a transaction 31 public static void committransaction(connection connection) { 32 try { 33 connection.createstatement().executeupdate("commit TRANSACTION;"); 34 } catch (SQLException ex) { 35 System.out.println("Commit transaction failed"); 36 } 37 } //makes a rollback of the transaction 40 public static void rollbacktransaction(connection connection) { 41 try { 42 connection.createstatement().executeupdate("rollback TRANSACTION;"); 43 } catch (SQLException ex) { 44 System.out.println("Rollback transaction failed"); 45 } 46 } //sets the isolation level 49 public static void setisolationlevel(connection connection, String isolationlevel) { 50 try { 51 connection.createstatement().executeupdate("set TRANSACTION ISOLATION LEVEL " + isolationlevel + ";"); 52 } catch (SQLException ex) { 28
29 53 System.out.println("Set Isolation Level failed"); 54 } 55 } //inserts a new value in the table 58 public static void insertvalue(connection connection) { 59 Statement st = null; 60 try { 61 st = connection.createstatement(); 62 st.executeupdate("insert INTO " + TABLENAME + " (id, value) VALUES (5, 30);"); 63 st.close(); 64 } catch (SQLException ex) { 65 System.out.println("Insert failed"); 66 } 67 } //updates a value in the table 70 public static void updatevalue(connection connection) { 71 Statement st = null; 72 try { 73 st = connection.createstatement(); 74 st.executeupdate("update " + TABLENAME + " SET value=1 WHERE id=2;"); 75 st.close(); 76 } catch (SQLException ex) { 77 System.out.println("Update failed"); 78 } 79 } //updates the first value in the table 82 public static void updatefirst(connection connection, int value) { 83 Statement st = null; 84 try { 85 st = connection.createstatement(); 86 st.executeupdate("update " + TABLENAME + " SET value=" + value +" WHERE id=1;"); 87 st.close(); 88 } catch (SQLException ex) { 89 System.out.println("Update failed"); 90 } 91 } //deletes a value from the table 94 public static void deletevalue(connection connection) { 95 Statement st = null; 96 try { 97 st = connection.createstatement(); 98 st.executeupdate("delete FROM " + TABLENAME + " WHERE id=1;"); 99 st.close(); 100 } catch (SQLException ex) { 101 System.out.println("Delete failed"); 102 } 103 } //gets the sum over all values in the table 106 public static int getsum(connection connection) { 107 Statement st = null; 108 ResultSet rs = null; 109 int sum = 0; 110 try { 111 st = connection.createstatement(); 112 rs = st.executequery("select SUM(value) FROM " + TABLENAME + ";"); 113 rs.next(); 114 sum = rs.getint(1); 115 rs.close(); 116 st.close(); 117 } catch (SQLException ex) { 118 System.out.println("Failed to calculate the sum"); 119 } 120 return sum; 121 } //gets the first value from the table 124 public static int getfirst(connection connection) { 125 Statement st = null; 29
30 126 ResultSet rs = null; 127 int first = 0; 128 try { 129 st = connection.createstatement(); 130 rs = st.executequery("select value FROM " + TABLENAME + " WHERE id=1;"); 131 rs.next(); 132 first = rs.getint(1); 133 rs.close(); 134 st.close(); 135 } catch (SQLException ex) { 136 System.out.println("Failed to get first value"); 137 } 138 return first; 139 } //select table gives the whole table 142 private static final String QUERYSELECTTABLE = "SELECT id, value FROM " + TABLENAME + ";"; 143 public static void selecttable(connection connection) { 144 Statement st = null; 145 ResultSet rs = null; 146 ResultSetMetaData rsmd = null; 147 int spalten; try { 150 st = connection.createstatement(); 151 rs = st.executequery(queryselecttable); 152 rsmd = rs.getmetadata(); 153 spalten = rsmd.getcolumncount(); while (rs.next()) { 156 int i = 1; 157 while (i < spalten + 1) { 158 System.out.print(rs.getString(i) + " "); 159 i++; 160 } 161 System.out.print("\n"); 162 } rs.close(); 165 st.close(); 166 } catch (SQLException ex) { 167 System.out.println("Select failed"); 168 } 169 } 170 } Class DirtyRead 1 public class DirtyRead { 2 3 public void dirtyread(string isolationlevel) throws SQLException { 4 //Dirty Read 5 Connection connection = new DBConnection().connect(); 6 DBHelper.createTable(connection); 7 connection.close(); 8 9 //T1 begin 10 System.out.println("T1 begin work"); 11 Connection T1 = new DBConnection().connect(); 12 DBHelper.beginTransaction(T1); 13 DBHelper.setIsolationLevel(T1, isolationlevel); //T1 read 16 int sum1 = DBHelper.getSum(T1); 17 System.out.println("T1 read the sum -> " + sum1); //T2 begin 20 System.out.println(" T2 begin work"); 21 Connection T2 = new DBConnection().connect(); 22 DBHelper.beginTransaction(T2); 23 DBHelper.setIsolationLevel(T2, isolationlevel); 24 30
31 25 //T2 update 26 System.out.print(" T2 update a value, sum -> "); 27 DBHelper.updateValue(T2); 28 System.out.println(DBHelper.getSum(T2)); //T1 read 31 int sum2 = DBHelper.getSum(T1); 32 System.out.println("T1 read the sum -> " + sum2); 33 T1.close(); //T2 rollback 36 System.out.println(" T2 makes a rollback"); 37 DBHelper.rollbackTransaction(T2); 38 T2.close(); //Check 41 if (sum1 == sum2) { 42 System.out.println("OK: No Dirty Read"); 43 } else { 44 System.out.println("FAILURE: Dirty Read"); 45 } 46 } 47 } Class NonRepeateableRead 1 public class NonRepeateableRead { 2 3 public void nonrepeateableread(string isolationlevel) throws SQLException { 4 //Nonrepeatable Read 5 Connection connection = new DBConnection().connect(); 6 DBHelper.createTable(connection); 7 connection.close(); 8 9 //T1 begin 10 System.out.println("T1 begin work"); 11 Connection T1 = new DBConnection().connect(); 12 DBHelper.beginTransaction(T1); 13 DBHelper.setIsolationLevel(T1, isolationlevel); //T1 read 16 int sum1 = DBHelper.getSum(T1); 17 System.out.println("T1 read the sum -> " + sum1); //T2 begin 20 System.out.println(" T2 begin work"); 21 Connection T2 = new DBConnection().connect(); 22 DBHelper.beginTransaction(T2); 23 DBHelper.setIsolationLevel(T2, isolationlevel); //T2 update 26 System.out.print(" T2 update a value, sum -> "); 27 DBHelper.updateValue(T2); 28 System.out.println(DBHelper.getSum(T2)); //T2 commit 31 System.out.println(" T2 commit"); 32 DBHelper.commitTransaction(T2); 33 T2.close(); //T1 read 36 int sum2 = DBHelper.getSum(T1); 37 System.out.println("T1 read the sum -> " + sum2); //T1 commit 40 System.out.println("T1 commit"); 41 DBHelper.commitTransaction(T1); 42 T1.close(); //Check 45 if (sum1 == sum2) { 46 System.out.println("OK: No NonRepeateableRead"); 31
32 47 } else { 48 System.out.println("FAILURE: NonRepeateableRead"); 49 } 50 } 51 } Class PhantomRead 1 public class PhantomRead { 2 3 public void phantomread(string isolationlevel) throws SQLException { 4 //PhantomRead 5 Connection connection = new DBConnection().connect(); 6 DBHelper.createTable(connection); 7 connection.close(); 8 9 //T1 begin 10 System.out.println("T1 begin work"); 11 Connection T1 = new DBConnection().connect(); 12 DBHelper.beginTransaction(T1); 13 DBHelper.setIsolationLevel(T1, isolationlevel); //T1 read 16 int sum1 = DBHelper.getSum(T1); 17 System.out.println("T1 read the sum -> " + sum1); //T2 begin 20 System.out.println(" T2 begin work"); 21 Connection T2 = new DBConnection().connect(); 22 DBHelper.beginTransaction(T2); 23 DBHelper.setIsolationLevel(T2, isolationlevel); //T2 insert 26 System.out.print(" T2 insert a value, sum -> "); 27 DBHelper.insertValue(T2); 28 System.out.println(DBHelper.getSum(T2)); //T2 commit 31 System.out.println(" T2 commit"); 32 DBHelper.commitTransaction(T2); 33 T2.close(); //T1 read 36 int sum2 = DBHelper.getSum(T1); 37 System.out.println("T1 read the sum -> " + sum2); //T1 commit 40 System.out.println("T1 commit"); 41 DBHelper.commitTransaction(T1); 42 T1.close(); //Check 45 if (sum1 == sum2) { 46 System.out.println("OK: No PhantomRead"); 47 } else { 48 System.out.println("FAILURE: PhantomRead"); 49 } 50 } 51 } Class LostUpdate 1 public class LostUpdate { 2 3 private Connection T1 = new DBConnection().connect(); 4 private Connection T2 = new DBConnection().connect(); 5 6 public void lostupdate(string isolationlevel) throws SQLException { 7 //LostUpdate 8 Connection connection = new DBConnection().connect(); 9 DBHelper.createTable(connection); 10 connection.close(); 32
33 11 12 //T1 begin 13 System.out.println("T1 begin work"); 14 DBHelper.beginTransaction(T1); 15 DBHelper.setIsolationLevel(T1, isolationlevel); //T2 begin 18 System.out.println(" T2 begin work"); 19 DBHelper.beginTransaction(T2); 20 DBHelper.setIsolationLevel(T2, isolationlevel); //T1 read 23 System.out.print("T1 read the first value -> "); 24 int before1 = DBHelper.getFirst(T1); 25 System.out.println(before1); //T2 read 28 System.out.print(" T2 read the first value -> "); 29 int before2 = DBHelper.getFirst(T1); 30 System.out.println(before2); //T1 update 33 int after1 = before ; 34 System.out.println("T1 update first value, from " + before1 + " to " + after1); 35 DBHelper.updateFirst(T1, after1); //T2 update 38 final int after2 = before2-5; 39 System.out.println(" T2 update first value, from " + before2 + " to " + after2); 40 //open the second update in a new Thread for waiting of the commit from T1 41 new Thread() { 42 public void run() { 43 try { 44 DBHelper.updateFirst(T2, after2); 45 } catch (Exception ex) { 46 System.out.println("Failure in Thread"); 47 } 48 } 49 }.start(); 50 //sleep for two seconds to be sure that the thread is started 51 try { 52 Thread.sleep(2000); 53 } catch (InterruptedException e) { 54 } //T1 commit 57 System.out.println("T1 commit"); 58 DBHelper.commitTransaction(T1); //T2 commit 61 System.out.println(" T2 commit"); 62 DBHelper.commitTransaction(T2); //check 65 int dbvalueafter = DBHelper.getFirst(T1); 66 if (dbvalueafter == after1) { 67 System.out.println("OK: No LostUpdate, Value in DB -> " + dbvalueafter); 68 } else { 69 System.out.println("FAILURE: LostUpdate, Value in DB -> " + dbvalueafter); 70 } T1.close(); 73 T2.close(); 74 } 75 } 33
Tag 4 Inhaltsverzeichnis
Tag 4 Inhaltsverzeichnis Normalformen Problem Formen (1-4) Weitere Formen Transaktionen Synchronisationsprobleme Überblick Autocommit Locking Savepoints Isolation levels Übungen RDB 4-1 Normalformen Problematik
Mehr10.6 Programmier-Exits für Workitems
10.6 Programmier-Exits für Workitems 279 10.6 Programmier-Exits für Workitems 10.6.1 Das Interface IF_SWF_IFS_WORKITEM_EXIT Am Schritt einer Workflow-Definition im Reiter»Programmier-Exits«können verschiedene
Mehr1 Transaktionen in SQL. 2 Was ist eine Transaktion. 3 Eigenschaften einer Transaktion. PostgreSQL
1 Transaktionen in SQL Um Daten in einer SQL-Datenbank konsistent zu halten, gibt es einerseits die Möglichkeit der Normalisierung, andererseits sog. Transaktionen. 2 Was ist eine Transaktion Eine Transaktion
MehrSynchronisierung von Transaktionen ohne Sperren. Annahme: Es gibt eine Methode, zu erkennen, wann eine Transaktion die serielle Ordnung verletzt.
OPTIMISTIC CONCURRENCY CONTROL Synchronisierung von Transaktionen ohne Sperren. Annahme: Es gibt eine Methode, zu erkennen, wann eine Transaktion die serielle Ordnung verletzt. Abbruch einer Transaktion
MehrTag 4 Inhaltsverzeichnis
Tag 4 Inhaltsverzeichnis Normalformen Problem Formen (1-4) Weitere Formen Transaktionen Synchronisationsprobleme Überblick Autocommit Locking Savepoints Isolation levels Übungen RDB 4-1 Normalformen Problematik
MehrDipl. Inf. Dipl. Math. Y. Orkunoglu Datum: 11.09.2009
Hochschule Darmstadt DATENBANKEN Fachbereich Informatik Praktikum 3 Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum: 11.09.2009 PL/SQL Programmierung Anwendung des Cursor Konzepts und Stored Procedures Und Trigger
MehrJDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.
JDBC in 5 Schritten JDBC (Java Database Connectivity) ist eine Sammlung von Klassen und Schnittstellen, mit deren Hilfe man Verbindungen zwischen Javaprogrammen und Datenbanken herstellen kann. 1 Einrichten
MehrDatenbanken: Transaktionskonzept und Concurrency Control
Wesentlich für das Arbeiten mit Datenbanken sind konsistente Datenbestände! Folgerung: es muss sichergestellt werden, dass Datenmanipulationen von Benutzern immer in einem erneut konsistenten Zustand der
MehrOracle: Abstrakte Datentypen:
Oracle: Abstrakte Datentypen: Oracle bietet zwei mögliche Arten um abstrakte Datentypen zu implementieren: Varying Array Nested Table Varying Array (kunde) kdnr kdname gekaufteart 1 Mustermann 1 4 5 8
MehrHandbuch. Artologik EZ-Equip. Plug-in für EZbooking version 3.2. Artisan Global Software
Artologik EZ-Equip Plug-in für EZbooking version 3.2 Artologik EZbooking und EZ-Equip EZbooking, Ihre webbasierte Software zum Reservieren von Räumen und Objekten, kann nun durch die Ergänzung um ein oder
MehrHandbuch Fischertechnik-Einzelteiltabelle V3.7.3
Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3
MehrCisco AnyConnect VPN Client - Anleitung für Windows7
Cisco AnyConnect VPN Client - Anleitung für Windows7 1 Allgemeine Beschreibung 2 2 Voraussetzungen für VPN Verbindungen mit Cisco AnyConnect Software 2 2.1 Allgemeine Voraussetzungen... 2 2.2 Voraussetzungen
MehrTransaktionen in der Praxis. Dr. Karsten Tolle
Transaktionen in der Praxis Dr. Karsten Tolle Praxisbeispiel in Java Connection con = null; try { con = DriverManager.getConnection("jdbc:db2:sample"); } catch (Exception e) { e.printstacktrace(); } con.setautocommit(false);
MehrDatenbanken Konsistenz und Mehrnutzerbetrieb III
Datenbanken Konsistenz und Mehrnutzerbetrieb III 1. Oracle Architektur! Komponenten des Oracle Servers! Zugriff über Netzwerk 2. Zugriffsrechte! Starten und Schließen der Datenbank! Nutzer und Rollen!
MehrHinweise zur Installation von MySQL
Hinweise zur Installation von MySQL Im Folgenden werden einige Hinweise gegeben, die die Einrichtung einer MySQL-Lernumgebung am eigenen Windows-Rechner erleichtern sollen. Der Text ist vor allem für diejenigen
MehrDokumentation IBIS Monitor
Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt
MehrAbschluss Version 1.0
Beschreibung Der Abschluss wird normalerweise nur einmal jährlich durchgeführt. Dieses Tech-Note soll helfen, diesen doch seltenen aber periodisch notwendigen Vorgang problemlos durchzuführen. Abschlussvarianten
MehrDas Handbuch zu Simond. Peter H. Grasch
Peter H. Grasch 2 Inhaltsverzeichnis 1 Einführung 6 2 Simond verwenden 7 2.1 Benutzereinrichtung.................................... 7 2.2 Netzwerkeinrichtung.................................... 9 2.3
MehrTransaktionen in Praxis. Dr. Karsten Tolle Vorl
Transaktionen in Praxis Dr. Karsten Tolle Vorl. 13.06.2017 Probleme bei Transaktionen Lost Update und Inconsistent Retrieval Sichtweise vom Benutzer Auszug aus SQL 92 1) P1 ("Dirty read"): SQL-transaction
MehrUnsere Webapplikation erweitern
Unsere Webapplikation erweitern Um die Webapplikation zu benutzen: 1. Starten Sie den Server, indem Sie das Hauptprogramm in der Klasse ImdbServer starten. 2. Laden Sie im Browser die Seite http://localhost:8080/html/index.html.
MehrIsolationsstufen für Transaktionen. Dr. Karsten Tolle
Isolationsstufen für Transaktionen Dr. Karsten Tolle Probleme bei Transaktionen Gewährleistung der Isolation Sperren kein Lost Update Read 1 (Accounts[13]) Read 2 (Accounts[13]) Write 2 (Accounts[13],101.000)
MehrJava Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1
Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1 Was ist JDBC? Hauptsächlich eine Sammlung von Java Klassen und Schnittstellen für eine einfache Verbindung von Java Programmen
Mehrhttps://portal.microsoftonline.com
Sie haben nun Office über Office365 bezogen. Ihr Account wird in Kürze in dem Office365 Portal angelegt. Anschließend können Sie, wie unten beschrieben, die Software beziehen. Congratulations, you have
MehrDatenbanken für Online Untersuchungen
Datenbanken für Online Untersuchungen Im vorliegenden Text wird die Verwendung einer MySQL Datenbank für Online Untersuchungen beschrieben. Es wird davon ausgegangen, dass die Untersuchung aus mehreren
MehrDieser Foliensatz darf frei verwendet werden unter der Bedingung, dass diese Titelfolie nicht entfernt wird.
Thomas Studer Relationale Datenbanken: Von den theoretischen Grundlagen zu Anwendungen mit PostgreSQL Springer, 2016 ISBN 978-3-662-46570-7 Dieser Foliensatz darf frei verwendet werden unter der Bedingung,
MehrEinführung in die Programmierung
Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In
MehrBeispiel: DB-Mock (1/7)
Beispiel: DB-Mock (1/7) Aufgabe: DB, auf die vereinfachend nur lesend zugeriffen wird mocken warum: benötigte keine DB-Lizenz, garantiert gleiche Werte ohne aufwändiges reset, kein Zeitverlust durch Verbindungsaufbau
MehrNotizen. 1 Inhaltsverzeichnis 1 INHALTSVERZEICHNIS... 1 2 EINLEITUNG... 2 3 KONFIGURATIONSEINSTELLUNGEN... 3 4 VERTRAUENSWÜRDIGE SITES HINZUFÜGEN...
Seite1 1 Inhaltsverzeichnis 1 INHALTSVERZEICHNIS... 1 2 EINLEITUNG... 2 3 KONFIGURATIONSEINSTELLUNGEN... 3 3.1 KONFIGURATIOSNEINSTELLUNGEN FÜR INTERNET EXPLORER... 3 3.2 ANZAHL AN GLEICHZEITIGEN DOWNLOADS
MehrPostgreSQL Wartungsstrategien
Jens Wilke PGConf.DE 11. November 2011 Wartungsstrategien Warum Wartung? Autovacuum Tuning Repairtools Warum Wartung? Statistiken pg statistic ANALYZE MVCC (Multiversion Concurrency Control) Wiederverwendung
MehrZählen von Objekten einer bestimmten Klasse
Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --
MehrAnwendungsbeispiele Sign Live! Secure Mail Gateway
Anwendungsbeispiele Sign Live! Secure Mail Gateway Kritik, Kommentare & Korrekturen Wir sind ständig bemüht, unsere Dokumentation zu optimieren und Ihren Bedürfnissen anzupassen. Ihre Anregungen sind uns
MehrWhitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und 2005. combit GmbH Untere Laube 30 78462 Konstanz
combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager Datensatzhistorie mit dem SQL Server 2000 und 2005 Datensatzhistorie mit dem SQL Server 2000 und 2005-2 - Inhalt
MehrDownloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler
Downloadfehler in DEHSt-VPSMail Workaround zum Umgang mit einem Downloadfehler Downloadfehler bremen online services GmbH & Co. KG Seite 2 Inhaltsverzeichnis Vorwort...3 1 Fehlermeldung...4 2 Fehlerbeseitigung...5
MehrIn diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.
In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access Die Grundlagen der Datenbanken kurspc15 Inhaltsverzeichnis Access... Fehler! Textmarke nicht
MehrDokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser
Dokumentation Black- und Whitelists Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser Inhalt INHALT 1 Kategorie Black- und Whitelists... 2 1.1 Was sind Black- und Whitelists?...
MehrWindows Vista Security
Marcel Zehner Windows Vista Security ISBN-10: 3-446-41356-1 ISBN-13: 978-3-446-41356-6 Leseprobe Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41356-6 sowie im Buchhandel
Mehr14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt
14.4.2016 Technische Hochschule Georg Agricola WORKSHOP TEIL 3 IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Morse-Tabelle...
MehrMatrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 -
Matrix42 Use Case - Sicherung und Rücksicherung persönlicher Version 1.0.0 23. September 2015-1 - Inhaltsverzeichnis 1 Einleitung 3 1.1 Beschreibung 3 1.2 Vorbereitung 3 1.3 Ziel 3 2 Use Case 4-2 - 1 Einleitung
MehrMSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003
Page 1 of 8 SMTP Konfiguration von Exchange 2003 Kategorie : Exchange Server 2003 Veröffentlicht von webmaster am 25.02.2005 SMTP steht für Simple Mail Transport Protocol, welches ein Protokoll ist, womit
MehrGrundlagen verteilter Systeme
Universität Augsburg Insitut für Informatik Prof. Dr. Bernhard Bauer Wolf Fischer Christian Saad Wintersemester 08/09 Übungsblatt 3 12.11.08 Grundlagen verteilter Systeme Lösungsvorschlag Aufgabe 1: a)
MehrOutlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang
sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche
MehrÜbung: Verwendung von Java-Threads
Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum
MehrLineargleichungssysteme: Additions-/ Subtraktionsverfahren
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als
MehrInstallation SQL- Server 2012 Single Node
Installation SQL- Server 2012 Single Node Dies ist eine Installationsanleitung für den neuen SQL Server 2012. Es beschreibt eine Single Node Installation auf einem virtuellen Windows Server 2008 R2 mit
MehrProjektbericht Gruppe 12. Datenbanksysteme WS 05/ 06. Gruppe 12. Martin Tintel Tatjana Triebl. Seite 1 von 11
Datenbanksysteme WS 05/ 06 Gruppe 12 Martin Tintel Tatjana Triebl Seite 1 von 11 Inhaltsverzeichnis Inhaltsverzeichnis... 2 1. Einleitung... 3 2. Datenbanken... 4 2.1. Oracle... 4 2.2. MySQL... 5 2.3 MS
MehrDatenbanken Kapitel 2
Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,
Mehrmysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank
mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank In den ersten beiden Abschnitten (rbanken1.pdf und rbanken2.pdf) haben wir uns mit am Ende mysql beschäftigt und kennengelernt, wie man
MehrOP-LOG www.op-log.de
Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server
MehrInstallation der SAS Foundation Software auf Windows
Installation der SAS Foundation Software auf Windows Der installierende Benutzer unter Windows muss Mitglied der lokalen Gruppe Administratoren / Administrators sein und damit das Recht besitzen, Software
MehrKundenspezifische Preise im Shop WyRu Online-Shop
Kundenspezifische Preise im Shop WyRu Online-Shop Team WyRu Christian Wyk / Günter Rubik SCS Bürocenter B1, A-2334 Vösendorf Internet http://www.wyru.at Kundenspezifische Preise sind ein Feature des WyRu
MehrObjektorientierte Programmierung
Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum
MehrTutorial: Erstellen einer vollwertigen XP Home CD aus der EEE 901 Recover DVD
Tutorial: Erstellen einer vollwertigen XP Home CD aus der EEE 901 Recover DVD Von SpecialK für www.eee-pc.de Stand:Version 1.0 vom 25.08.2008 Vorwort: Mit Hilfe dieses Tutorials wird aus der beim EEE 901
MehrStundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten
Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe
Mehr<script type="text/javascript"> <! <%= page(page.searchsuggestionsscript) %> // > </script>
1. Intelligente AutoComplete Funktion für die Volltextsuche 1.1. JQuery einbinden Falls Sie in Ihrem Shop bereits JQuery verwenden, so überprüfen Sie bitte, ob Sie alle notwendigen Dateien eingebunden
Mehrmit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007
6. Übung zur Vorlesung Datenbanken im Sommersemester 2007 mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007 Aufgabe 1: Rekursion Betrachten Sie die folgende Tabelle
MehrSQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar
Qt-Seminar Dienstag, 10.2.2009 SQL ist......die Abkürzung für Structured Query Language (früher sequel für Structured English Query Language )...ein ISO und ANSI Standard (aktuell SQL:2008)...eine Befehls-
MehrErweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:
VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt
MehrDB Restore mit SQL Server7
DB Restore mit SQL Server7 Dok.-Nr: MO-SQL7-RE Version: 1.2 Datum: 23.11.2001 Status: In Bearbeitung Klassifizierung: Unklassifiziert Autor: R. Peter Verteiler: Alle DB-Admin. & Inf. Verantwortliche Einleitung
MehrSysteme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss
Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige
Mehrmiditech 4merge 4-fach MIDI Merger mit :
miditech 4merge 4-fach MIDI Merger mit : 4 x MIDI Input Port, 4 LEDs für MIDI In Signale 1 x MIDI Output Port MIDI USB Port, auch für USB Power Adapter Power LED und LOGO LEDs Hochwertiges Aluminium Gehäuse
MehrP.A. Bernstein, V. Hadzilacos, N. Goodman
TRANSAKTIONEN UND DATENINTEGRITÄT Concurrency Control and Recovery in Database Systems P.A. Bernstein, V. Hadzilacos, N. Goodman Addison Wesley, 1987. Kapitel 1. und 6. Grundlagen der Datenbanksysteme
MehrInformatik Grundlagen, WS04, Seminar 13
Informatik Grundlagen, WS04, Seminar 13 Informatik Informatik Grundlagen, Seminar 13 WS04 1 Was wir heute besprechen Nachbesprechen von Übungsblatt 11 Rekursion Grundprinzipien Übung Besprechung Übungsblatt
MehrProzedurale Datenbank- Anwendungsprogrammierung
Idee: Erweiterung von SQL um Komponenten von prozeduralen Sprachen (Sequenz, bedingte Ausführung, Schleife) Bezeichnung: Prozedurale SQL-Erweiterung. In Oracle: PL/SQL, in Microsoft SQL Server: T-SQL.
MehrUmzug der Datenbank Firebird auf MS SQL Server
Umzug der Datenbank Firebird auf MS SQL Server Umzugsanleitung auf MS SQL Server Im Folgenden wird ein Umzug der julitec CRM Datenbank von Firebird auf MS SQL Server 2008 Express R2 beschrieben. Datensicherung
MehrWie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden?
Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden? Anforderung Durch die Bearbeitung einer XML-Datei können Sie Ihre eigenen Dokumentationen (z.b. PDF-Dateien, Microsoft Word Dokumente
MehrORM & OLAP. Object-oriented Enterprise Application Programming Model for In-Memory Databases. Sebastian Oergel
ORM & OLAP Object-oriented Enterprise Application Programming Model for In-Memory Databases Sebastian Oergel Probleme 2 Datenbanken sind elementar für Business-Anwendungen Gängiges Datenbankparadigma:
MehrLokale Installation von DotNetNuke 4 ohne IIS
Lokale Installation von DotNetNuke 4 ohne IIS ITM GmbH Wankelstr. 14 70563 Stuttgart http://www.itm-consulting.de Benjamin Hermann hermann@itm-consulting.de 12.12.2006 Agenda Benötigte Komponenten Installation
MehrL10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016
L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele
Mehrmobilepoi 0.91 Demo Version Anleitung Das Software Studio Christian Efinger Erstellt am 21. Oktober 2005
Das Software Studio Christian Efinger mobilepoi 0.91 Demo Version Anleitung Erstellt am 21. Oktober 2005 Kontakt: Das Software Studio Christian Efinger ce@efinger-online.de Inhalt 1. Einführung... 3 2.
MehrInstallationsanleitung für das KKL bzw. AGV4000 Interface
Installationsanleitung für das KKL bzw. AGV4000 Interface Diese Anleitung ist unter Windows XP erstellt worden, ist aber auch übertragbar auf Windows 2000/ Vista / Windows 7. Je nach Einstellungen des
MehrIhr IT-Administrator oder unser Support wird Ihnen im Zweifelsfall gerne weiterhelfen.
Dieses Dokument beschreibt die nötigen Schritte für den Umstieg des von AMS.4 eingesetzten Firebird-Datenbankservers auf die Version 2.5. Beachten Sie dabei, dass diese Schritte nur bei einer Server-Installation
MehrAGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b
AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität
MehrDrucken aus der Anwendung
Drucken aus der Anwendung Drucken aus der Anwendung Nicht jeder Großformatdruck benötigt die volle Funktionsvielfalt von PosterJet - häufig sind es Standarddrucke wie Flussdiagramme und Organigramme die
MehrPHP - Projekt Personalverwaltung. Erstellt von James Schüpbach
- Projekt Personalverwaltung Erstellt von Inhaltsverzeichnis 1Planung...3 1.1Datenbankstruktur...3 1.2Klassenkonzept...4 2Realisierung...5 2.1Verwendete Techniken...5 2.2Vorgehensweise...5 2.3Probleme...6
MehrUrs Meier (urs.meier@trivadis.com) Art der Info Technical Info (Februar 2002) Aus unserer Projekterfahrung und Forschung
Betrifft Optimizer Autor Urs Meier (urs.meier@trivadis.com) Art der Info Technical Info (Februar 2002) Quelle Aus unserer Projekterfahrung und Forschung Einführung Mit jedem Oracle Release nimmt die Anzahl
MehrPostgreSQL in großen Installationen
PostgreSQL in großen Installationen Cybertec Schönig & Schönig GmbH Hans-Jürgen Schönig Wieso PostgreSQL? - Die fortschrittlichste Open Source Database - Lizenzpolitik: wirkliche Freiheit - Stabilität,
MehrOnline-Dateienablage und Datenaustauschdienst Box.net Stand: September 2011
Online-Dateienablage und Datenaustauschdienst Box.net Stand: September 2011 Jan Oesch, PHBern, Institut Sekundarstufe II Der Datenaustauschdienst Box.net eignet sich besonders für den regelmässigen Austausch
MehrErweiterung AE WWS Lite Win: AES Security Verschlüsselung
Erweiterung AE WWS Lite Win: AES Security Verschlüsselung Handbuch und Dokumentation Beschreibung ab Vers. 1.13.5 Am Güterbahnhof 15 D-31303 Burgdorf Tel: +49 5136 802421 Fax: +49 5136 9776368 Seite 1
MehrSpeicher in der Cloud
Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG
MehrSEMINAR Modifikation für die Nutzung des Community Builders
20.04.2010 SEMINAR Modifikation für die Nutzung des Community Builders Step by Step Anleitung ecktion SEMINAR Modifikation für die Nutzung des Community Builders Step by Step Anleitung Bevor Sie loslegen
MehrSQL (Structured Query Language) Schemata Datentypen
2 SQL Sprachelemente Grundlegende Sprachelemente von SQL. 2.1 Übersicht Themen des Kapitels SQL Sprachelemente Themen des Kapitels SQL (Structured Query Language) Schemata Datentypen Im Kapitel SQL Sprachelemente
MehrKlassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java
Objektorientierte Programmierung mit Java Eine praxisnahe Einführung mit BlueJ Klassenentwurf Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? 1.0 Zentrale Konzepte
MehrViews in SQL. 2 Anlegen und Verwenden von Views 2
Views in SQL Holger Jakobs bibjah@bg.bib.de, holger@jakobs.com 2010-07-15 Inhaltsverzeichnis 1 Wozu dienen Views? 1 2 Anlegen und Verwenden von Views 2 3 Schreibfähigkeit von Views 3 3.1 Views schreibfähig
MehrAnleitung zur Verwendung der VVW-Word-Vorlagen
Anleitung zur Verwendung der VVW-Word-Vorlagen v1.0. Jun-15 1 1 Vorwort Sehr geehrte Autorinnen und Autoren, wir haben für Sie eine Dokumentenvorlage für Microsoft Word entwickelt, um Ihnen die strukturierte
MehrGITS Steckbriefe 1.9 - Tutorial
Allgemeines Die Steckbriefkomponente basiert auf der CONTACTS XTD Komponente von Kurt Banfi, welche erheblich modifiziert bzw. angepasst wurde. Zuerst war nur eine kleine Änderung der Komponente für ein
MehrSeite 1 von 14. Cookie-Einstellungen verschiedener Browser
Seite 1 von 14 Cookie-Einstellungen verschiedener Browser Cookie-Einstellungen verschiedener Browser, 7. Dezember 2015 Inhaltsverzeichnis 1.Aktivierung von Cookies... 3 2.Cookies... 3 2.1.Wofu r braucht
MehrExcel Auswertungen in XAuftrag / XFibu
1 Excel Auswertungen in XAuftrag / XFibu Im Folgenden wird kurz beschrieben, wie Anwender die Sicherheitseinstellungen in Excel Auswertungen anpassen können. Sicherheitseinstellungen verhindern, dass Makros
MehrAnleitung. Lesezugriff auf die App CHARLY Termine unter Android Stand: 18.10.2013
Anleitung Lesezugriff auf die App CHARLY Termine unter Android Stand: 18.10.2013 CHARLY Termine unter Android - Seite 2 Inhalt Inhalt Einleitung & Voraussetzungen 3 1. Installation und Konfiguration 4
MehrElexis-BlueEvidence-Connector
Elexis-BlueEvidence-Connector Gerry Weirich 26. Oktober 2012 1 Einführung Dieses Plugin dient dazu, den Status Hausarztpatient zwischen der BlueEvidence- Anwendung und Elexis abzugleichen. Das Plugin markiert
MehrPrint2CAD 2017, 8th Generation. Netzwerkversionen
Installation der Netzwerkversion Kazmierczak Software Print2CAD 2017, 8th Generation Print2CAD 2017, 8th Generation Netzwerkversionen Einführung Installationshinweise Die Programme von Kazmierczak Software
MehrDer lokale und verteilte Fall
Lokale Beans Der lokale und verteilte Fall RemoteClient Lokaler Client (JSP) RemoteSession/Entity-Bean Lokale Session/Entity-Bean 2 Lokale Beans Die bisher vorgestellten EJBswaren immer in der Lage auf
MehrEinführung in Javadoc
Einführung in Javadoc Johannes Rinn http://java.sun.com/j2se/javadoc Was ist Javadoc? Javadoc ist ein Werkzeug, dass eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil:
MehrInstallation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden
Installation von Druckern auf dem ZOVAS-Notebook Bei der Installation eines Druckers muss grundsätzlich unterschieden werden, ob der Drucker direkt am Notebook angeschlossen ist oder ob ein Drucker verwendet
MehrInstallation LehrerConsole (für Version 6.2)
Dr. Kaiser Systemhaus GmbH Köpenicker Straße 325 12555 Berlin Telefon: (0 30) 65 76 22 36 Telefax: (0 30) 65 76 22 38 E-Mail: info@dr-kaiser.de Internet: www.dr-kaiser.de Installation LehrerConsole (für
MehrGrundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung
Grundlagen der Programmierung Prof. H. Mössenböck 14. Schrittweise Verfeinerung Entwurfsmethode für Algorithmen Wie kommt man von der Aufgabenstellung zum Programm? Beispiel geg.: Text aus Wörtern ges.:
MehrSMARTtill Server mit Manager
SMARTtill Server mit Manager Benutzerhandbuch 2014 Das Handbuch bezieht sich auf die Standardeinstellungen bei einer Pilotinstallation. Bei neuen Partnernprojekten sind Anpassungen zwingend notwendig und
MehrMySQL 101 Wie man einen MySQL-Server am besten absichert
MySQL 101 Wie man einen MySQL-Server am besten absichert Simon Bailey simon.bailey@uibk.ac.at Version 1.1 23. Februar 2003 Change History 21. Jänner 2003: Version 1.0 23. Februar 2002: Version 1.1 Diverse
Mehretutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche
etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:
Mehr5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu
Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten
Mehr