Benutzer mit den meisten Antworten
Transaktionsisolation bei SQL

Frage
-
Kann mir jemand sagen, wie sich das verhält?
Wenn ich in einer Transaktion mit z.B. "Repeatable Read", eine betimmte Anzahl Datensätze aus Tabelle1 lese,
diese dann verändere (auch Werte aus Feldern in eine andere Tabelle übernehme),
dann die Tabellen gemeinsam in der Transaktion speichere.Sind die Datensätze (aus Tabelle1), die in dieser Transaktion gelesen wurden, für andere zum lesen gesperrt,
bis die Transaktion beendet ist?
Gibt es eine solche Einstellung?Danke für Antwort.
Gruss Peter
Antworten
-
Hallo Peter,
Repeatable Read bedeutet was der Name sagt: Wenn Du die Daten einer Zeile in einer Transaktion mehrmalig abrufst, so ist sichergestellt das sich der Inhalt nicht verändert hat - was z. B. bei der (Standardisolationsstufe) Read Committed passieren kann, da dort Zeilen direkt nach ihrer Verarbeitung freigegeben werden.
Mehrere Transaktionen können parallel lesend auf die Daten zugreifen, und erhalten alle das gleiche Ergebnis (dem Moment des ersten Zugriffs).
Sobald Du Zeilen veränderst spielt es keine Rolle mehr, ob Du Repeatable Read verwendest. Dann werden betroffene Zeilen exklusiv gesperrt, d. h. andere Sitzungen / Transaktionen können darauf erst zugreifen, wenn die Transaktion abgeschlossen (Commit) oder zurückgesetzt (Rollback) wird.
Ausgenommen wäre Read Uncommitted - bzw. der Hinweis WITH (NOLOCK). Dabei werden Sperren nicht beachtet und man erhält den gerade vorliegende Inhalt (der falsch sein kann, wenn eine Transaktion zurückgesetzt oder mehrfach geändert wird).
Siehe auch. SET TRANSACTION ISOLATION LEVEL (Transact-SQL) - dort werden auch die Snapshot- Isolationsstufen beschrieben.
Gruß Elmar
- Als Antwort markiert peter haus Mittwoch, 14. Mai 2014 19:21
Alle Antworten
-
Hallo Peter,
Repeatable Read bedeutet was der Name sagt: Wenn Du die Daten einer Zeile in einer Transaktion mehrmalig abrufst, so ist sichergestellt das sich der Inhalt nicht verändert hat - was z. B. bei der (Standardisolationsstufe) Read Committed passieren kann, da dort Zeilen direkt nach ihrer Verarbeitung freigegeben werden.
Mehrere Transaktionen können parallel lesend auf die Daten zugreifen, und erhalten alle das gleiche Ergebnis (dem Moment des ersten Zugriffs).
Sobald Du Zeilen veränderst spielt es keine Rolle mehr, ob Du Repeatable Read verwendest. Dann werden betroffene Zeilen exklusiv gesperrt, d. h. andere Sitzungen / Transaktionen können darauf erst zugreifen, wenn die Transaktion abgeschlossen (Commit) oder zurückgesetzt (Rollback) wird.
Ausgenommen wäre Read Uncommitted - bzw. der Hinweis WITH (NOLOCK). Dabei werden Sperren nicht beachtet und man erhält den gerade vorliegende Inhalt (der falsch sein kann, wenn eine Transaktion zurückgesetzt oder mehrfach geändert wird).
Siehe auch. SET TRANSACTION ISOLATION LEVEL (Transact-SQL) - dort werden auch die Snapshot- Isolationsstufen beschrieben.
Gruß Elmar
- Als Antwort markiert peter haus Mittwoch, 14. Mai 2014 19:21