Isolationsstufen
Wenn Sperren als Kontrollmechanismus für Transaktionen verwendet werden, können Parallelitätsprobleme gelöst werden. Sperren ermöglichen, dass mehrere Transaktionen gleichzeitig, aber völlig isoliert voneinander ausgeführt werden. Als Isolationsstufe wird die Stufe bezeichnet, ab der eine Transaktion inkonsistente Daten akzeptiert. Eine höhere Isolationsstufe bietet höheren Schutz gegen inkonsistente Daten, der Nachteil ist jedoch die geringere Parallelität.
In SQL Server Compact wird über die für eine Anwendung erforderliche Isolationsstufe das Sperrverhalten von SQL Server Compact bestimmt.
SQL Server Compact unterstützt folgende Isolationsstufen (in aufsteigender Reihenfolge):
Read Committed (Standardeinstellung von SQL Server Compact)
Repeatable Read
Serializable (Transaktionen sind voneinander isoliert)
Auf einer höheren Isolationsstufe haben die Daten höheren Schutz vor Dateninkonsistenzen. Damit wird jedoch die Parallelität der Transaktion reduziert, und der Mehrbenutzerzugriff wird beeinträchtigt.
Hinweis
SQL Server Compact stellt sicher, dass eine Transaktion Daten einer anderen Transaktion, für die kein Commit ausgeführt wurde, nicht lesen kann (Dirty Read). Dazu wird ein Mechanismus zur Versionsverwaltung für Seiten verwendet, der Benutzern das Lesen von Daten ermöglicht, ohne S-Sperren für die Daten anzufordern. Dies ermöglicht hohe Parallelität bei (SELECT)-Lesevorgängen.
Isolationsstufen und Parallelitätsprobleme
In der folgenden Tabelle werden die einzelnen Isolationsstufen und die möglichen Parallelitätsprobleme der einzelnen Stufen aufgeführt.
Hinweis
Zu den möglichen Parallelitätsproblemen gehören die Abhängigkeit von Daten, für die kein Commit ausgeführt wurde, die inkonsistente Analyse und das Lesen eines Phantoms. Weitere Informationen zu Parallelitätsproblemen finden Sie unter Parallelität.
Isolationsstufe |
Abhängigkeit von Daten, für die kein Commit ausgeführt wurde (Dirty Read) |
Inkonsistente Analyse (nicht wiederholbarer Lesevorgang) |
Lesen eines Phantoms |
---|---|---|---|
Read Committed |
Nein |
Ja |
Ja |
Repeatable Read |
Nein |
Nein |
Ja |
Serializable |
Nein |
Nein |
Nein |
Die Isolationsstufen können entweder programmgesteuert festgelegt werden oder mit der folgenden SQL-Syntax: SET TRANSACTION ISOLATION LEVEL. Weitere Informationen finden Sie unter Isolationsstufen von Transaktionen.
Isolationsstufe im Transaktionsbereich
Die Standardisolationsstufe für System.Transaction ist ReadCommitted. Eine Transaktion in einem Transaktionsbereich wird jedoch standardmäßig mit der Isolationsstufe Serializable ausgeführt. Wenn eine SQL Server Compact-Verbindung in einem Transaktionsbereich eingetragen ist, wird demnach die implizite Transaktion (eine SQL Server Compact-Transaktion, die intern für den Transaktionsbereich erstellt wird) standardmäßig mit der Isolationsstufe Serializable ausgeführt. Einige der überladenen Konstruktoren der TransactionScope-Klasse akzeptieren die Isolationsstufe als Parameter. Diese sollten verwendet werden, um für die implizite Transaktion einen anderen Isolationsstufenwert anzugeben. Wenn die angegebene Isolationsstufe von SQL Server Compact nicht unterstützt wird, wird beim Eintragen einer SQL Server Compact-Verbindung in einen Transaktionsbereich eine Ausnahme ausgelöst.
Außerdem wird durch die default lock timeout-Eigenschaft, die als Teil der Verbindungszeichenfolge angegeben wird, die Wartezeit einer Transaktion bestimmt. Wenn jedoch eine Verbindung in einem TransactionScope eingetragen ist, wird diese Eigenschaft durch die TimeSpan von TransactionScope überschrieben. Wenn z. B. die Verbindungszeichenfolge den default lock timeout-Wert ''1000 ms'' enthält und die Verbindung mit 100 ms in einem TransactionScope eingetragen ist, dauert die Umgebungstransaktion statt 1000 ms nur 100 ms. Soll die Anwendung längere Transaktionstimeouts verwenden und Befehle in einem TransactionScope ausführen, müssen Sie den Timeoutwert sowohl in der Verbindungszeichenfolge als auch in der TimeSpan für den TransactionScope angeben.
Hinweis
Der default lock timeou-Wert ist standardmäßig auf 2000 ms festgelegt und der TransactionScope-Wert auf 1 Minute.