Używając IsolationLevel.Snapshot, ale DB wciąż się blokuje

Jestem częścią zespołu budującego stronę internetową opartą na ADO.NET. Czasami mamy kilku programistów i zautomatyzowane narzędzie testujące, pracujące jednocześnie jako kopia rozwojowa bazy danych.

Używamy poziomu izolacji migawek, który według mojej najlepszej wiedzy wykorzystuje optymistyczną współbieżność: zamiast blokować ma nadzieję na najlepsze i zgłasza wyjątek, jeśli spróbujesz zatwierdzić transakcję, jeśli zmienione wiersze zostały zmienione przez inną stronę podczas transakcja.

Aby użyć poziomu izolacji migawki, używamy:

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

iw C #:

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

Zauważ, że migawka IsolationLevel nie jest tym samym co Snapshot ReadCommitted, którego próbowaliśmy również, ale obecnie nie jest używana.

Gdy jeden z programistów wejdzie w tryb debugowania i wstrzyma aplikację .NET, podczas debugowania utrzyma połączenie z aktywną transakcją. Teraz spodziewam się, że nie będzie to problemem - w końcu wszystkie transakcje używają poziomu izolacji migawki, więc gdy jedna transakcja jest wstrzymana, inne transakcje powinny być w stanie normalnie kontynuować, ponieważ wstrzymana transakcja nie zawiera żadnych blokad. Oczywiście po wstrzymaniu transakcji prawdopodobnie wykryje konflikt; ale jest to dopuszczalne tak długo, jak inni programiści i automatyczne testy mogą działać bez przeszkód.

Jednak w praktyce, gdy jedna osoba zatrzymuje transakcję podczas debugowania, wszyscy inni użytkownicy DB próbujący uzyskać dostęp do tych samych wierszy są blokowani pomimo użycia poziomu izolacji migawki.

Czy ktoś wie, dlaczego tak się dzieje i / lub jak mogę osiągnąć prawdziwą optymistyczną (nie blokującą) współbieżność?

Rozdzielczość (dla mnie niefortunna): Remus Rusanu zauważył, że pisarze zawsze blokują innych pisarzy; to jest wspierane przezMSDN - nie wychodzi i nie mówi tak, ale zawsze wspomina o unikaniu zamków czytelników. Krótko mówiąc, zachowanie, którego chcę, nie jest zaimplementowane w SQL Server.

questionAnswers(2)

yourAnswerToTheQuestion