Usando IsolationLevel.Snapshot, mas o banco de dados ainda está bloqueando

Eu faço parte de um time que constrói um site baseado em ADO.NET. Às vezes, temos vários desenvolvedores e uma ferramenta de teste automatizada trabalhando simultaneamente em uma cópia de desenvolvimento do banco de dados.

Usamos o nível de isolamento de snapshot, que, tanto quanto é do meu conhecimento, usa simultaneidade otimista: em vez de bloquear, ele espera o melhor e lança uma exceção se você tentar confirmar uma transação se as linhas afetadas tiverem sido alteradas por outra parte durante a transação.

Para usar o nível de isolamento de instantâneo, usamos:

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

e em c #:

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

Observe que o IsolationLevel Snapshot não é o mesmo que o ReadCommitted Snapshot, que também tentamos, mas não estamos usando atualmente.

Quando um dos desenvolvedores entra no modo de depuração e pausa o aplicativo .NET, eles mantêm uma conexão com uma transação ativa durante a depuração. Agora, espero que isso não seja um problema - afinal, todas as transações estão usando o nível de isolamento de instantâneo, portanto, enquanto uma transação é pausada, outras transações devem poder prosseguir normalmente, pois a transação em pausa não mantém nenhum bloqueio. Naturalmente, quando a transação pausada é concluída, é provável que ela detecte um conflito; mas isso é aceitável, desde que outros desenvolvedores e os testes automatizados possam prosseguir sem obstáculos.

No entanto, na prática, quando uma pessoa interrompe uma transação durante a depuração, todos os outros usuários de banco de dados que tentam acessar as mesmas linhas são bloqueados, apesar do uso do nível de isolamento de instantâneo.

Alguém sabe por que isso ocorre e / ou como posso obter uma concorrência verdadeiramente otimista (sem bloqueio)?

A resolução (uma infeliz para mim): Remus Rusanu observou que os escritores sempre bloqueiam outros escritores; isso é apoiado porMSDN - não chega a ser dito, mas apenas menciona evitar bloqueios de leitor-escritor. Em suma, o comportamento que eu quero não é implementado no SQL Server.

questionAnswers(2)

yourAnswerToTheQuestion