Datenbanken 11 Transaktionen Karl Meier [email protected] 23.11.2010 Inhalt Transaktion ACID Isolationsebenen MySQL Tabellentypen Transaktion erstellen COMMIT ROLLBACK 23.11.2010 11 Transaktionen 2 1 Definition Transaktion Eine Transaktion (TA) ist eine logisch zusammengehörige Folge von Datenbankbefehlen, die eine DB von einem logisch konsistenten Zustand in einen anderen logisch konsistenten Zustand überführen. Das Datenbanksystem garantiert bei der Ausführung einer Transaktion die Einhaltung vier grundlegender Eigenschaften (ACID Regel). 23.11.2010 11 Transaktionen 3 Ziele Mehrbenutzerbetrieb concurrency control Fehlertoleranz recovery 23.11.2010 11 Transaktionen 4 2 ACID 23.11.2010 Atomicity ´Alles oder nichts´ Consistency Konsistenz I solation Unabhängigkeit Durability Dauerhaftigkeit 11 Transaktionen 5 Atomicity Die Transaktion, die aus einer oder mehreren Operationen bestehen kann wird entweder vollständig oder gar nicht ausgeführt. Bei einem Fehler werden alle bisherigen Operationen der Transaktion rückgängig gemacht (ROLLBACK). ´Alles oder nichts´-Regel 23.11.2010 11 Transaktionen 6 3 Consistency Eine Transaktion überführt die Datenbank von einem konsistenten Zustand DBt1 in einen anderen konsistenten Zustand DBt2. Konsistenzerhaltung 23.11.2010 11 Transaktionen 7 Isolation Eine Transaktion sieht keine Zwischenresultate einer anderen, parallel laufenden Transaktion. Unabhängigkeit 23.11.2010 11 Transaktionen 8 4 Durability Änderungen einer Transaktion gehen auch bei nachfolgenden Fehlersituationen nie verloren ( Backup / Recovery ) Dauerhaftigkeit 23.11.2010 11 Transaktionen 9 Komponenten der Transaktionsverwaltung Concurrency control Isolation von parallel laufenden Transaktionen keine Inkonsistenz bei Mehrbenutzerbetrieb automatische Synchronisationsmechanismen Recovery Fehlerhandling (Hardware und Software) Abbruch (system-, bzw. anwendungsinitiiert) 23.11.2010 11 Transaktionen 10 5 Isolationsebenen Durch den Transaction Isolation Level wird der Grad der Parallelität von Transaktionen gesteuert. Höherer Level bedeutet: Höhere Sicherheit für Aktualität der Daten (READ) Weniger Probleme bezüglich Konsistenz Geringerer Durchsatz bei grosser Anzahl Zugriffe 23.11.2010 11 Transaktionen 11 SQL2-Standard Isolationsebene 0: READ UNCOMMITED Lesezugriff auf alle Daten Keine Sperren dirty read Isolationsebene 1: READ COMMITED Modifizierte Datensätze gesperrt Non-repeatable read / Phantom Isolationsebene 2: REPEATABLE READ Alle Datensätze gesperrt Phantom-Problem Isolationsebene 3: SERIALIZABLE Volle Serialisierbarkeit Keine Probleme 23.11.2010 11 Transaktionen 12 6 Problem 1 Dirty Read Die Transaktion T1 modifiziert einen Datensatz. Eine weitere Transaktion T2 liest diesen Datensatz bevor T1 COMMIT oder ROLLBACK durchgeführt hat. Wenn nun T1 einen ROLLBACK durchführt, hat T2 Daten gelesen, die nie festgeschrieben wurden, also nie wirklich existierten. 23.11.2010 11 Transaktionen 13 Beispiel w1[x]: Write von Transaktion 1 auf Datensatz x r2[x]: Read von Transaktion 2 von Datensatz x a1: ROLLBACK von Transaktion 1 c2: COMMIT von Transaktion 2 P1: w1[x]… r2[x]… (a1 und c2 beliebig) w1[x=120] r2[x=120] a1 c2 100 23.11.2010 120 100 11 Transaktionen t 14 7 Problem 2 Non-repeatable oder Fuzzy Read Die Transaktion T1 liest einen Datensatz. Eine zweite Transaktion T2 modifiziert oder löscht diesen Datensatz mit COMMIT. Falls nun T1 denselben Datensatz nochmals liest, erhält sie modifizierte Daten oder stellt fest, dass diese gelöscht worden sind. 23.11.2010 11 Transaktionen 15 Beispiel P2: r1[x]… w2[x]… c2… r1[x]… c1 r1[x=100] w2[x=120] c2 r1[x=120] c1 100 23.11.2010 t 120 11 Transaktionen 16 8 Problem 3 Phantom Die Transaktion T1 liest eine Anzahl Datensätze anhand einer Suchbedingung. Eine Transaktion T2 erstellt weitere Datensätze (COMMIT), welche ebenfalls diese Suchbedingung erfüllen. Wenn nun T1 mit denselben Suchbedingungen liest, resultiert eine andere Datenmenge. 23.11.2010 11 Transaktionen 17 Beispiel P3: r1[P]… w2[y in P]… c2… r1[P]… c1 r1[SELECT * FROM t_ma WHERE ort=„chur“;] w2[UPDATE t_ma SET ort=„chur“ WHERE name=„huber“;] c2 r1[SELECT * FROM t_ma WHERE ort=„chur“;] c1 2 rows 23.11.2010 11 Transaktionen t 3 rows 18 9 Zusammenfassung w1[x]: Write von Transaktion 1 auf Datensatz x r2[x]: Read von Transaktion 2 von Datensatz x a1: ROLLBACK von Transaktion 1 c2: COMMIT von Transaktion 2 P1: w1[x]… r2[x]… (a1 und c2 beliebig) P2: r1[x]… w2[x]… c2… r1[x]… c1 P3: r1[P]… w2[y in P]… c2… r1[P]… c1 23.11.2010 11 Transaktionen 19 ANSI SQL Isolation Levels Dirty Read Fuzzy Read Phantom ja ja ja READ COMMITTED nein ja ja REPEATABLE READ nein nein ja SERIALIZABLE nein nein nein Isolation Level READ UNCOMMITTED 23.11.2010 11 Transaktionen 20 10 Locking Die meisten SQL Produkte benutzen Isolation mit Locking Mechanismen. Read (Share) Lock Write (Exclusive) Lock 23.11.2010 11 Transaktionen 21 Problem 0 Dirty Write Die Transaktion T1 modifiziert einen Datensatz. Eine weitere Transaktion T2 modifiziert diesen Datensatz bevor T1 COMMIT oder ROLLBACK durchgeführt hat. Wenn nun T1 oder T2 einen ROLLBACK durchführen, ist unklar, wie nun der korrekte Wert aussieht. P0: w1[x]… w2[x]… ((c1 oder a1) und (c2 oder a2) beliebig) 23.11.2010 11 Transaktionen 22 11 Beispiel w1[x=120] w2[x=130] c1 c2 100 120 23.11.2010 130 t ? 11 Transaktionen 23 ANSI SQL Isolation Levels Isolation Level Dirty Write Dirty Read Fuzzy Read Phantom READ UNCOMMITTED nein ja ja ja READ COMMITTED nein nein ja ja REPEATABLE READ nein nein nein ja SERIALIZABLE nein nein nein nein 23.11.2010 11 Transaktionen 24 12 Weitere Probleme Lost Update P4: r1[x]… w2[x]… w1[x]… c1 Beispiel: r1[x=100] r2[x=100] w2[x=120] c2 w1[x=130] c1 t 100 23.11.2010 120 130 11 Transaktionen 25 Lektüre zum Thema „A Critique of ANSI SQL Isolation Levels“ ftp://ftp.research.microsoft.com/pub/tr/tr-95-51.pdf Mögliche Anomalien/Phänomene in Datenbanken bei der Ausführung von Transaktionen im Mehrbenutzerbetrieb „Generalized Isolation Level Definitions“ http://www.pmg.lcs.mit.edu/papers/icde00.pdf 23.11.2010 11 Transaktionen 26 13 my.cnf Optionsdatei Die meisten MySQL-Programme können Startoptionen aus Optionsdateien (auch Konfigurationsdateien genannt) auslesen. 23.11.2010 11 Transaktionen 27 Beispiel my.cnf [mysqld] datadir = /mysql/data default-storage-engine = InnoDB transaction-isolation = READ-COMMITTED Hinweis: Auf Unix-Plattformen ignoriert MySQL Konfigurationsdateien, die für alle schreibbar (worldwritable) sind. Dies ist beabsichtigt und dient der Erhöhung der Sicherheit. 23.11.2010 11 Transaktionen 28 14 MySQL Tabellentypen MySQL kann nicht nur die eigenen Tabellentypen ISAM/MyISAM handhaben, sondern weitere wie Archive und solche von Drittanbietern wie InnoDB. Standardmässig arbeitet MySQL ab Version 3.23 mit MyISAM. Der Tabellentyp lässt sich mit der Klausel ENGINE beim Erzeugen der Tabelle angeben. 23.11.2010 11 Transaktionen 29 Speicherorte MySQL erzeugt beim Erstellen einer Tabelle immer eine Datei tabelle.frm. Diese enthält die Tabellen- und Spaltendefinitionen. Abhängig vom Tabellentyp werden Index und Daten in anderen Dateien gespeichert. SHOW VARIABLES LIKE ´datadir´; 23.11.2010 11 Transaktionen 30 15 Tabellendateien MySQL Datenbanken als Verzeichnisse MySQL MyISAM Tabellen als Dateien tabelle.frm tabelle.MYD tabelle.MYI 23.11.2010 Tabellenschema MyISAM Tabellendaten MyISAM Indizes 11 Transaktionen 31 Gross-/Kleinschreibung Windows: mysql> CREATE DATABASE Sammlung; Query OK, 1 row affected (0.00 sec) mysql> USE sammlung; Database changed UNIX: mysql> CREATE DATABASE Sammlung; Query OK, 1 row affected (0.00 sec) mysql> USE sammlung ERROR 1049: Unknown database ‘sammlung’ SHOW VARIABLES LIKE ´lower_case_table_names´; 23.11.2010 11 Transaktionen 32 16 lower_case_table_names Benutzen Sie lower_case_table_names=0 unter Unix und lower_case_table_names=2 unter Windows/OSX. 23.11.2010 11 Transaktionen 33 MySQL eigene Tabellentypen Archive Blackhole CSV Falcon Federated InnoDB Memory Merge MyISAM NDB/MySQL Cluster 23.11.2010 11 Transaktionen 34 17 Archive Ab MySQL 5.0 Für historische/archivierte Daten Komprimiert gespeicherte Daten Nur INSERT und SELECT Keine Indizes möglich Priorität Platzbedarf / Performance nicht relevant ENGINE=ARCHIVE 23.11.2010 11 Transaktionen 35 Blackhole Ab MySQL 5.0 „Schwarzes Loch“ für Daten Keine Datenspeicherung BLACKHOLE wurde entwickelt, um die Syntax von SQL-Statements zu prüfen und ein Binärlog zu schreiben. ENGINE=BLACKHOLE 23.11.2010 11 Transaktionen 36 18 CSV Ab MySQL 5.1 Speichert Daten als CSV-Textfile und erlaubt damit flat-file Datenmanipulation Keine Transaktionen und Foreign Keys Kein Index Support Eingeschränkte Sicherheit Einfacher Zugriff auf externe Datenquellen ENGINE=CSV 23.11.2010 11 Transaktionen 37 Falcon Ursprünglich geplant 2010als Ersatz für die InnoDB ACID Transaktionssupport Hohe Performance Entwicklung am 13.4.2010 durch Oracle eingestellt 23.11.2010 11 Transaktionen 38 19 Federated Ab MySQL 5.0 Logische Datenbank aus mehreren physikalischen Datenbanken, welche auf verschiedenen Servern liegen Im Moment auf MySQL 5.1 aus Qualitätsgründen und anderen Prioritäten deaktiviert ENGINE=FEDERATED 23.11.2010 11 Transaktionen 39 Federated Syntax CREATE TABLE sys_client ( # list all your attributes here ) ENGINE = FEDERATED DEFAULT CHARSET = utf8 COMMENT = 'write your comment here' CONNECTION = 'mysql://user:[email protected]:3306/ testDB/sys_client'; Die Federated Engine muss in der my.cnf Datei enabled sein. 23.11.2010 11 Transaktionen 40 20 InnoDB Bietet transaktionsunterstützung Fremdschlüssel möglich Seit 2005 bei Oracle ENGINE=INNODB 23.11.2010 11 Transaktionen 41 Memory Sehr schnell Nicht persistent Daten nur im Memory gespeichert Nur Tabellenstruktur auf der Festplatte Nicht alle Datentypen unterstützt ENGINE=MEMORY 23.11.2010 11 Transaktionen 42 21 Merge Verbindet mehrer MyISAM Tabellen zu einer einzigen logischen Keine Speicherlimite Beschränkter SQL Befehlssatz SELECT, (INSERT), UPDATE, DELETE DROP einer MERGE-Tabelle löscht nur deren MERGESpezifikation, keine Daten ENGINE=MERGE UNION=(tabelle1, tabelle2,…) INSERT_METHOD=FIRST|LAST 23.11.2010 11 Transaktionen 43 MyISAM Ab Version 3.23 Standard-Tabellentyp Hardware- und Betriebssystemunabhängig Transaktionen sind nicht unterstützt Speicherung als Dateien tabelle.frm: Tabellenstruktur tabelle.MYD: Daten tabelle.MYI: Index ENGINE=MyISAM 23.11.2010 11 Transaktionen 44 22 NDB / MySQL Cluster ACID-Transaktionen unterstützt Hohe Verfügbarkeit (bis 99.999%) Eingebaute Clustering Mechanismen Shared Nothing Architektur Keine Foreign Key Unterstützung ENGINE=NDB 23.11.2010 11 Transaktionen 45 Defaulttyp Der Default-Tabellentyp kann mit einer Startoption des Servers, bzw. einem Eintrag in der Konfigurationsdatei my.cnf gesetzt werden. [mysqld] default-table-type=myisam 23.11.2010 11 Transaktionen 46 23 Third-Party Storage Engines IBMDB2I MariaDB PBXT ScaleDB XtraDB 23.11.2010 11 Transaktionen 47 IBMDB2I Diese Engine ist ein Adapter, welches Zugriff auf DB2 Tabellen auf der i5 Plattform von IBM erlaubt. Der Zugriff erfolgt über ein MySQL basiertes Interface. Natives DB2 Format für Datenspeicherung Zugriff via MySQL oder native i5 Anwendungen 23.11.2010 11 Transaktionen 48 24 MariaDB Monty Program AB Alpha Release Fork der MyISAM Engine Transaktionssupport geplant Erweiterungen Data Warehouse geplant 23.11.2010 11 Transaktionen 49 PBXT PrimeBase XT von SNAP Innovation GmbH www.primebase.org 23.11.2010 11 Transaktionen 50 25 ScaleDB ScaleDB Inc. Transaktionsfähig Hohes Datenvolumen, hohe Verfügbarkeit Shared Disk Clustering Architektur Beta Release www.scaledb.com 23.11.2010 11 Transaktionen 51 XtraDB Clone der InnoDB Engine www.percona.com Peter Zaitsev Multiple Rollback Performance Diagnostic Speed Enhancement 23.11.2010 11 Transaktionen 52 26 InnoDB InnoDB ergänzt MySQL mit einem Transaction Handler und Foreign Keys. Internet: http://www.innodb.com http://www.innodb.com/support/documentation InnoDB Engine in MySQL: Reference Manual 23.11.2010 11 Transaktionen 53 Datenspeicherung 23.11.2010 11 Transaktionen 54 27 Allgemeines zu InnoDB 1 InnoDB ist MyISAM dann überlegen, wenn eine Anwendung viele Einfügevorgänge oder Aktualisierungen in Tabellen vornimmt. Bei Lesevorgängen ist MyISAM in der Regel schneller. InnoDB unterstützt Transaktionen und referentielle Integrität. InnoDB und MyISAM lassen sich gleichzeitig nutzen, auch in einem Statement (z.B. in Joins). 23.11.2010 11 Transaktionen 55 Allgemeines zu InnoDB 2 InnoDB Tabellen benötigen mehr Speicherplatz als MyISAM Tabellen. (Etwa doppelt so viel) InnoDB Tabellen lesen in SELECT Statements nur die angegebenen Spalten. MyISAM Tabellen werden aber datensatzweise eingelesen und anschliessend entsprechend berechnet. Daher sind InnoDB Tabellen MyISAM Tabellen bei sehr grossen Datensätzen in der Regel überlegen. 23.11.2010 11 Transaktionen 56 28 InnoDB Tabellen mysql> CREATE TABLE customer (a INT, b CHAR(20), INDEX (a)) -> ENGINE = InnoDB; Query OK, 0 rows affected (0.26 sec) oder: default-table-type=innodb 23.11.2010 im My.cnf file 11 Transaktionen 57 Konversion MyISAM zu InnoDB Systemtabellen (mysql) nicht konvertieren! ALTER TABLE tabelle ENGINE=InnoDB; Achtung: InnoDB Tabellen belegen bedeutend mehr Platz als MyISAM Tabellen. 23.11.2010 11 Transaktionen 58 29 Foreign Keys CREATE TABLE t_parent (id INT NOT NULL, PRIMARY KEY (id)) TYPE=InnoDB; CREATE TABLE t_child (id INT, parent_id INT, INDEX i_par (parent_id), FOREIGN KEY (parent_id) REFERENCES t_parent(id) ON DELETE CASCADE ) ENGINE=InnoDB; InnoDB erstellt die Indizes auf Fremdschlüssel und referenzierte Schlüssel nicht automatisch, daher müssen diese explizit erstellt werden. 23.11.2010 11 Transaktionen 59 Foreign Keys anzeigen SHOW CREATE TABLE tabelle; 23.11.2010 11 Transaktionen 60 30 Beispiel mysql> SHOW CREATE TABLE t_ma_proj; +-----------+-------------------------------------------------+ | Table | Create Table +-----------+-------------------------------------------------+ | t_ma_proj | CREATE TABLE `t_ma_proj` ( `ma_id` int(11) NOT NULL default '0', `proj_id` int(11) NOT NULL default '0', PRIMARY KEY (`ma_id`,`proj_id`), KEY `i_ma` (`ma_id`), KEY `i_proj` (`proj_id`), FOREIGN KEY (`proj_id`) REFERENCES `mav.t_proj` (`proj_id`) ON DELETE CASCADE, FOREIGN KEY (`ma_id`) REFERENCES `mav.t_ma` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB | -+-----------+------------------------------------------------+ 1 row in set (0.00 sec) 23.11.2010 11 Transaktionen 61 Transaktionen mit InnoDB Row Level Locking Default ist REPEATABLE READ Ab MySQL 4.0.5 alle 4 Isolationslevel transaction-isolation = … im File my.cnf 23.11.2010 11 Transaktionen 62 31 Transaktionen mit MySQL MySQL started per Default im AUTOCOMMIT Modus, d.h. jedes SQL Statement wird sofort in der DB festgeschrieben. Für Transaktionen muss daher entweder SET AUTOCOMMIT = 0; gesetzt oder BEGIN; … COMMIT; bzw. BEGIN; … ROLLBACK; verwendet werden. 23.11.2010 11 Transaktionen 63 SET TRANSACTION SYNTAX SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE] Setzt die Transaktionsisolationsebene global, für die gesamte Sitzung oder für die nächste Transaktion. Default: Setzen der Isolationsebene für die nächste Transaktion. GLOBAL betrifft alle neu erzeugten Threads. (PROCESS-Privileg) SESSION betrifft die folgenden und alle zukünftigen Transaktionen. Default-Isolationsebene für mysqld mit --transaction-isolation=... setzen. 23.11.2010 11 Transaktionen 64 32 Achtung !!! Folgende Befehle beenden eine Transaktion automatisch (COMMIT): ALTER TABLE BEGIN CREATE INDEX DROP DATABASE DROP TABLE RENAME TABLE TRUNCATE 23.11.2010 11 Transaktionen 65 Transaktion und Lock‘s Die Serialisierbarkeit von Transaktionen wird durch sogenannte Locks erreicht, die konkurrierende Aktionen mit einem Datensatz verhindern. Ein Datensatz kann drei Zustände aufweisen: unlocked read-locked (shared lock) write-locked (exclusive lock) 23.11.2010 11 Transaktionen 66 33 Zweiphasen Sperrprotokolle Two Phase Locking Grundregeln R1: Sperranforderung vor jedem Objektzugriff R2: Sperren paralleler Transaktionen dürfen nicht in Konflikt zueinander stehen R3: Nicht mehrere Sperren für ein Objekt innerhalb einer Transaktion R4: Bei Transaktionsende sind alle Sperren freizugeben 23.11.2010 11 Transaktionen 67 Two-phase locking Um zu garantieren, dass alle Paare von Operationen in zwei Transaktionen, die einen Konflikt hervorrufen, in der gleichen Reihenfolge durchgeführt werden (serial equivalence), darf eine Transaktion, sobald sie einmal einen Lock freigegeben hat kein weiteres Datenelement mehr locken. Daraus folgt, das jede Transaktion in zwei Phasen zerlegt werden kann: In der growing phase fordert die Transaktion Locks an und in der shrinking phase gibt sie diese Locks wieder frei. Das wird auch two-phase-locking genannt. 23.11.2010 11 Transaktionen 68 34 Two-Phase-Locking write lock (lock promotion) unlock read lock write lock unlock 1 exclusive lock 23.11.2010 unlocked read lock read lock 2 unlock … unlock shared lock 11 Transaktionen 69 Two-Phase-Locking Das Two-Phase Locking Protokoll fordert: Vor jeder Leseaktion r[x] ein readlock[x] Vor jeder Schreibaktion w[x] ein writelock[x] Für jedes lock muss ein unlock durchgeführt werden Frühester Zeitpunkt für Freigabe (unlock) ist: Kein weiterer Zugriff mehr auf Datenobjekt Keine weiteren lock Operationen folgen 23.11.2010 11 Transaktionen 70 35 Beispiel Transaktion T: Transaktion U: Bank_Belastung(Konto A, 100 sFr.) Bank_Belastung(Konto C, 200 sFr.) Bank_Gutschrift(Konto B, 100 sFr.) Bank_Gutschrift(Konto B, 200 sFr.) Operation Operation Locks Locks Begin Transaction Saldo := A.Read() read lock A A.Write(Saldo -100) write lock A Begin Transaction Saldo := B.Read() read lock B B.Write(Saldo+100) write lock B End Transaction unlock A, B 23.11.2010 Saldo := C.Read() read lock C C.Write(Saldo -200) write lock C Saldo := B.Read() wartet wegen T lock auf B … … read lock B B.Write(Saldo+200) write lock B End Transaction unlock B, C 11 Transaktionen 71 Domino Effekt Transaktionen T1: T2: lock(acc1) read(acc1) acc1 := acc1 + 100 write(acc1) unlock acc1 lock(acc1), lock(acc2) read(acc1), read(acc2) acc1 := acc1 - 100 acc2 := acc2 +100 write(acc1), write(acc2) unlock(acc1), unlock(acc2) commit abort 23.11.2010 11 Transaktionen 72 36 Strict Two-Phase-Locking Wenn die Transaktionen ihre Locks bis zum Commit oder Abort behalten und diese erst dann wieder freigeben, so nennt man dies strict twophase-locking. Strict two-phase-locking wird verwendet, da beim two-phase-locking noch nicht feststeht, ob ein Datenelement, dem der Lock entzogen wurde, bevor die Transaktion ein COMMIT durchführt, wirklich den korrekten Wert enthält (und daher von anderen Transaktionen schon gelesen werden darf), da die Transaktion ja auch abgebrochen werden könnte. 23.11.2010 11 Transaktionen 73 Deadlock Tritt immer dann auf, wenn zwei oder mehrere konkurrierende Prozesse nicht beendet werden können, weil diese darauf warten, dass der jeweils andere Prozess Resourcen freigibt, die der andere zum Lesen oder Schreiben gesperrt hat. Bei Datenbanken, deren Lockmechanismen (ROW/COLUMN/CELL/TABLE LOCKING) zu grob differenziert sind, entstehen hierdurch oft lange Reaktionszeiten. Häufiger ist allerdings falsche Programmierung die Ursache. 23.11.2010 11 Transaktionen 74 37 Beispiel Transaktion T: Transaktion U: Bank_Belastung(Konto A, 100 sFr.) Bank_Belastung(Konto C, 200 sFr.) Bank_Gutschrift(Konto B, 100 sFr.) Bank_Gutschrift(Konto B, 200 sFr.) Operation Operation Locks Locks Begin Transaction Saldo := A.Read() read lock A Begin Transaction A.Write(Saldo-100) write lock A Saldo := B.Read() read lock B B.Write(Saldo+100) wartet auf U 23.11.2010 Saldo := C.Read() read lock C C.Write(Saldo -200) write lock C Saldo := B.Read() shares read lock B B.Write(Saldo+200) wartet auf T 11 Transaktionen 75 Möglichkeiten im Umgang mit Deadlocks Vermeidung einfach, aber nicht unbedingt gut zu restriktiv, Zugriffsbeschränkung Erkennung Aufgabe des Lock Managers Timeout Lock wird nach Timeout „verletzlich“ und die ursprüngliche Transaktion bricht ab Gefahr des Abbruchs auch ohne Deadlock Problem bei lange andauernden Transaktionen 23.11.2010 11 Transaktionen 76 38 Lock Manager Die Clients haben natürlich keinen Zugriff zu Operationen für das Locking oder Unlocking, da ja sonst die Protokolle von trickreichen Programmierern verletzt werden könnten. Diese Funktionen werden vom lock manager - einem Serverprogramm durchgeführt. 23.11.2010 11 Transaktionen 77 Locks in MySQL InnoDB SELECT … FROM …; setzt keine locks (consistent read), Snapshot SELECT … FROM … LOCK IN SHARED MODE; setzt shared lock auf alle resultierenden Sätze SELECT … FROM … FOR UPDATE; setzt exclusive lock auf alle resultierenden Sätze 23.11.2010 11 Transaktionen 78 39 Zeitstempel Verfahren Vor allem bei verteilten Datenbanken kommt das Zeitstempel-Verfahren zur Anwendung. Anstelle von Sperren, wird eine Transaktion mit einer drohenden Verletzung der Serialisierbarkeitskriterien abgebrochen und neu gestartet. Dieses Verfahren soll präventiv verhindern, dass Deadlocks entstehen können. 23.11.2010 11 Transaktionen 79 MVCC Multiversioning Concurrency Control MVCC benutzt Transaktions-IDs um eine Serialisierung zu erreichen. MVCC stellt sicher, dass eine Transaktion nie auf Datenbankobjekte warten muss und verwaltet die verschiedenen Versionen eines Objektes. Jede Version eines Objektes P besitzt einen LeseZeitstempel RTS(P) (read timestamp), der den Startzeitstempel TS(T) derjenigen Transaktion T angibt, die P zuletzt gelesen hat. Wenn Ti dieses Objekt P ändert und TS(Ti) < RTS(P)=TS(T) gilt, dann wird die Transaktion Ti abgebrochen und neu gestartet. Andernfalls erstellt Ti eine neue Version von P und setzt den Lese/Schreib Zeitstempel von P auf TS(Ti). 23.11.2010 11 Transaktionen 80 40 Scheduler Der Scheduler gewährleistet die Koordination der verschiedenen Transaktionen. Die Bearbeitung von Zugriffskonflikten geschieht dabei zum einen pessimistisch (also zum Zeitpunkt des Zugriffs durch die Massnahme des Sperrens oder mittels eines Zeitstempels (als Abbruch und Neustart)) und zum anderen optimistisch (also am Ende der Transaktion durch einen vorwärts gerichteten oder rückwärts gerichteten Validierer (als jeweiligen Abbruch und Neustart)). 23.11.2010 11 Transaktionen 81 Validierer Ausgangspunkt ist die Tatsache/Annahme, dass Konflikte eher selten auftreten. Der Validierer (certifier) bearbeitet die Transaktionen auf der Grundlage von Datenbereichen, in denen die Menge der aktiven Transaktionen, die Menge der gelesenen Datenelemente und die Menge der geschriebenen Datenelemente gespeichert wird. Im Konfliktfall setzt der Validierer die Transaktion auf Abort, sonst auf Commit. 23.11.2010 11 Transaktionen 82 41 Savepoints InnoDB unterstützt die SQL Statements SAVEPOINT und ROLLBACK TO SAVEPOINT. SAVEPOINT identifier ROLLBACK TO SAVEPOINT identifier 23.11.2010 11 Transaktionen 83 Transaktionsfähige Engines 23.11.2010 11 Transaktionen 84 42 Data Warehouse Engines Calpont www.calpont.com InfoBright - BrightHouse www.infobright.org Kickfire www.kickfire.com TokuDB www.tokutek.com 23.11.2010 11 Transaktionen 85 23.11.2010 11 Transaktionen 86 43