Transaktionen Concurrency Management in MS SQL Server

Werbung
Transaktionen
Concurrency Management
in MS SQL Server
Transaktionen in SQL Server
• SQL Server bietet die Möglichkeit, eine Reihe von
Datenbankoperationen (Änderungen) in einem logischen Vorgang zu
gruppieren → Transaktionen
• Transaktionen stellen sicher, dass die ACID Eigenschaften
eingehalten warden
• Für eine gute Effizienz → sollte parallele Transaktionen unterstützen
• Die Operationen unterschiedlichen Benutzers werden als
verschiedene Transaktionen bearbeitet
Transaktionen in SQL Server
• Kontrollieren von Transaktionen:
• Transaktionen werden von Anwendung gesteuert, indem angegeben wird
wann eine Transaktion startet und anwendet
• Default wird jede Operation als separate Transaktion betrachtet
• Möglichkeiten:
• SQL-Anweisungen innerhalb Visual Studio
• Funktionen der ADO.NET oder anderen Datenbank APIs
• Im folgenden werden wir über SQL-Anweisungen reden
Kontrollieren von Transaktionen
• Starten von Transaktionen:
• BEGIN TRANSACTION / BEGIN TRAN
• ROLLBACK TRANSACTION / ROLLBACK TRAN
• COMMIT TRANSACTION / COMMIT TRAN
• SET IMPLICIT_TRANSACTIONS ON – steuert den impliziten Start einer Transaktionen
bei Ausführung einer Anweisung
• Nachdem sich eine Verbindung im impliziten Transaktionmodus befindet, müssen
sie darauf achten, eine Transaktion auch abzuschließen
• SET XACT_ABORT ON – falls ein SQL Error aufgetreten ist, wird die ganze Transaktion
zurückgesetzt (bei OFF wird nur die Anweisung, wo der Fehler aufgetreten ist,
zurückgesetzt)
Transaktionen in SQL Server
• SQL Server kann lokale oder verteilte Transaktionen benutzen:
• Lokale Transaktionen
• SAVE TRANSACTION – man definiert einen Sicherungspunkt → die Position, zu der
eine Transaktion zurückkehren kann
• Eine ROLLBACK TRANSACTION-Anweisung, die den Sicherungspunktnamen angibt,
führt ein Rollback der Transaktion bis zur letzten SAVE TRANSACTION-Anweisung
• SAVE TRANSACTION wird nicht in verteilten Transaktionen unterstützt
• Mit einer ROLLBACK TRANSACTION-Anweisung, in der savepoint_name angegeben
ist, werden alle Sperren freigegeben, die außerhalb des Sicherungspunkts aktiviert
werden
Transaktionen in SQL Server
• Verteilte Transaktionen:
• BEGIN DISTRIBUTED TRANSACTION
• Die Instanz von SQL Server-Datenbankmodul, die die BEGIN DISTRIBUTED
TRANSACTION-Anweisung ausführt, wird als Transaktionsurheber bezeichnet
und steuert den Abschluss der Transaktion
• COMMIT TRANSACTION startet einen von MS DTC (Microsoft Distributed
Transaction Coordinator) koordinierten Commit
Beispiel 1
SET XACT_ABORT ON;
BEGIN TRAN T1
INSERT INTO Studenten VALUES (9,'Ana','Ana');
INSERT INTO Studienvertrage VALUES (10,1);
COMMIT TRAN T1
Beispiel 2
BEGIN TRAN T1
BEGIN TRY
INSERT INTO Studenten VALUES (9,'Ana','Ana');
INSERT INTO Studienvertrage VALUES (10,1);
COMMIT TRAN T1
END TRY
BEGIN CATCH
ROLLBACK TRAN T1
END CATCH
Nebenläufigkeitskontrolle
• SQL Server Trnasaktionen Isolationsstufen lösen wichtige
Nebenläufigkeitsprobleme:
• Verlorengegangene Änderungen (lost updates): tauchen auf, wenn
zwei Transaktionen denselben Objekt ändern
• Dirty Read: taucht auf, wenn eine Transaktion uncommitted Daten liest
• Inkonsistente Analyse (unrepeatable reads): taucht auf wenn ein
existierendes Tupel während der Transaktion vom außen geändert
wird
• Phantom-Problem: taucht auf, wenn neue Daten eingefügt werden
und während einer Transaktionen neu erscheinen
Nebenläufigkeitskontrolle
• SQL Server sichert die Isolationsstufen mithilfe der Sperren:
• Schreibsperren sind exklusiv, Lesesperren sind shared
• Eine gut geschriebene Transaktion fordert die korrekten Sperren
bevor sie diese braucht
• Eine zwei-Phasen Transaktion behaltet die Sperren bis sie alle
nötige Sperren hat
• Isolationsstufen bestimmen wie lange Sperren behalten werden
Sperren in SQL Server
• Die Sperren werden normalerweise dynamisch von dem Sperrmanager verwaltet,
nicht von der Anwendung
• Granularität von Sperren:
• Auf Zeilenebene:
• zeilen-id (rid) – jeweils nur eine Zeile gesperrt
• schlüssel (key) – zeilenebene in einem Index, bezieht sich auf einen Schlüsselwert
•
•
•
•
Auf Seitenebene: seite (pag)
Auf eine Gruppe von 8 zusammenhängenden Date- oder Indexseiten: block (ext)
Auf Tabellenebene: tabelle (tab)
Auf Datenbankebene: datenbank (db)
• Sperren können mehrere Granularitäten haben
• Wie lange wir die Sperre behalten? → bestimmt von der Isolationsstufe
• Bis die Anweisung ausgeführt wird
• Bis die Transaktion beendet wird
Sperren in SQL Server
S
U
X
S
Yes
Yes
No
U
Yes
No
No
X
No
No
No
Sperrmodi:
• Gemeinsam / Shared (S) – nur-Lese-Sperre
• Exklusiv (X) – wenn man Daten modifizieren muss. Nicht kompatibel mit anderen
Sperren (außer bei NOLOCK mit der READ UNCOMMITTED Isolationsstufe)
• Aktualisierung / Update (U) – S Sperre die später eine X Sperre wird
• Beabsichtigt / Intent (I) – zeigt an, dass SQL Server eine Sperre weiter plant
(intention to lock)
• Schema (Sch-M, Sch-S) – Schemamodifikation, Schemastabilität → beziehen sich auf
Änderungen des Datenbankschemas (Blockiert nur DDL, nicht DML Anweisungen)
• Massenaktualisierung / Bulk Update (BU) – verhindert den Zugriff auf die Tabellen
wo ein Bulk-Einfügen ausgeführt wird
• Schlüsselbereich / Key Range – sperrt Zeilen basierend auf eine Bedingung
Sperren in SQL Server
• Bevor SQL Server 7.0 konnte man nur
Seiten und Tabellen sperren um
Phantoms zu vermeiden
• Sperrinformationen anzeigen:
sp_lock
go
•
•
•
•
•
•
•
spid – Systemprozess-Id
dbid – Id der Datenbank, die die Sperre anfordert
ObjId – Id des Objektes, das die Sperre anfordert
IndId – Id des Index an
Type – gesperrte Ressourcentyp
Mode – Sperrmodus
Status – gibt an, ob die Sperre momentan erteilt ist (grant), auf einen anderen
Vorgang warten muss (wait) oder zu einer anderen Sperre konvertiert wird (cnvt)
Isolationsstufen
• READ UNCOMMITTED: Sperren werden nur für UPDATE-Befehle ausgelöst
(keine Sperre beim Lesen)
• Bietet die beste Parallelität, erlaubt aber Dirty-Reads, Phantomwerte und nicht
wiederholtes Lesen (unrepeatable reads)
• READ COMMITED: Behaltet die Sperre nur für die Ausführung dieser Anweisung
(Standardeinstellung von SQL Server)
• Vor jedem Lesevorgang muss ein Commit ausgeführt werden → erlaubt keine Dirty-Reads
mehr
• REPEATABLE READ: sperrt die Daten bei Lesevorgängen und behaltet diese bis
am Ende der Transaktion (erlaubt keine unrepeatable Reads mehr)
• SERIALIZABLE: behaltet die Sperren und die Schlüsselbereichsperren während
der ganzen Transaktion
• Transaktionen sind vollständig voneinander isoliert und damit serialisierbar (keine
Anomalien mehr)
• SNAPSHOT: man arbeitet auf Daten Snapshots
Isolationsstufen
• Je geringer die Isolation der Transaktionen, desto besser ist die
Parallelität
→ aber dann können Inkonsistenzen in den Daten vorkommen
• SQL Syntax:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED | READ
UNCOMMITTED | ...
Isolationsstufen
Read
Uncommitted
Read
Committed
Repeatable
Read
Serializable
Lost Updates?
Nein
Nein
Nein
Nein
Dirty Reads?
Ja
Nein
Nein
Nein
Unrepeatable
Reads?
Phantoms?
Ja
Ja
Nein
Nein
Ja
Ja
Ja
Nein
Deadlocks
• MS SQL Server entdeckt Deadlocks
• Default: die jüngste Transaktion wird abgebrochen
• Error 1205 – sollte erfasst werden und richtig behandelt werden
• SET LOCK TIMEOUT – läßt die maximale Zeitspanne ermitteln, für
welche eine Transaktion warten darf, bevor sie abgebrochen wird
• SET DEADLOCK PRIORITY
• Mögliche Werte: Low, Medium, High, numerisch {-10, -9, ..., 0, ..., 9, 10}
• Die Transaktion mit dem kleineren Priorität wird abgebrochen
Deadlock Situationen vermeiden
• Halten sie Transaktionen so klein wie möglich
• Lese die Eingaben von den Users und überpüfe diese vor dem Beginn
der Transaktion (nicht innerhalb einer Transaktion)
• Behalte (wenn möglich) dieselbe Reihenfolge bei dem Zugriff auf die
Daten zwischen den Transaktionen
• Benutze eine kleinere Isolationsstufe
• Zugriff auf so wenig wie möglich Daten in einer Transaktion
Herunterladen