Bei Verwendung von IsolationLevel.Snapshot wird die Datenbank jedoch weiterhin gesperrt

Ich bin Teil eines Teams, das eine ADO.NET-basierte Website erstellt. Manchmal arbeiten mehrere Entwickler und ein automatisiertes Testtool gleichzeitig an einer Entwicklungskopie der Datenbank.

Wir verwenden die Snapshot-Isolationsstufe, die meines Wissens eine optimistische Parallelität verwendet: Statt zu sperren, hofft sie auf die beste und löst eine Ausnahme aus, wenn Sie versuchen, eine Transaktion festzuschreiben, wenn die betroffenen Zeilen von einer anderen Partei während geändert wurden die Transaktion.

Um die Snapshot-Isolationsstufe zu verwenden, verwenden wir:

<code>ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
</code>

und in C #:

<code>Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);
</code>

Beachten Sie, dass der IsolationLevel-Snapshot nicht mit dem ReadCommitted-Snapshot identisch ist, den wir ebenfalls ausprobiert haben, aber derzeit nicht verwenden.

Wenn einer der Entwickler in den Debug-Modus wechselt und die .NET-App anhält, wird beim Debuggen eine Verbindung mit einer aktiven Transaktion hergestellt. Nun würde ich erwarten, dass dies kein Problem darstellt. Schließlich verwenden alle Transaktionen die Snapshot-Isolationsstufe. Während also eine Transaktion angehalten ist, sollten andere Transaktionen in der Lage sein, normal fortzufahren, da die angehaltene Transaktion keine Sperren aufweist. Wenn die angehaltene Transaktion abgeschlossen ist, wird wahrscheinlich ein Konflikt erkannt. Das ist aber akzeptabel, solange andere Entwickler und die automatisierten Tests ungehindert ablaufen können.

In der Praxis werden jedoch alle anderen DB-Benutzer, die versuchen, auf dieselben Zeilen zuzugreifen, trotz Verwendung der Snapshot-Isolationsstufe blockiert, wenn eine Person eine Transaktion während des Debuggens anhält.

Weiß jemand, warum dies auftritt und / oder wie ich eine wirklich optimistische (nicht blockierende) Parallelität erzielen kann?

Die Lösung (eine für mich unglückliche): Remus Rusanu stellte fest, dass Schriftsteller immer andere Schriftsteller blockieren; Dies wird von gesichertMSDN - es kommt nicht ganz heraus und sagt so, aber erwähnt immer nur das Vermeiden von Leser-Schreiber-Sperren. Kurz gesagt, das gewünschte Verhalten ist in SQL Server nicht implementiert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage