Pergunta

Eu sou parte de uma equipe de construção de um web-site ADO.NET base. Às vezes temos uma ferramenta de testes automatizados vários desenvolvedores e trabalhando simultaneamente uma cópia desenvolvimento de banco de dados.

Nós usamos o nível de isolamento de instantâneo, o que, para o melhor de meu conhecimento, usa concorrência otimista: em vez de bloqueio, que espera para o melhor e lança uma exceção se você tentar confirmar uma transação se as linhas afetadas foram alteradas por outra parte durante a transação.

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

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;

e em C #:

Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);

Note que IsolationLevel Snapshot não é o mesmo que ReadCommitted Snapshot, que também já tentou, mas não estão usando atualmente.

Quando um dos desenvolvedores entra no modo de depuração e pausa o aplicativo .NET, eles irão realizar uma conexão com uma transação ativa durante a depuração. Agora, eu espero que isso não será um problema - afinal, todas as transações são usando nível de isolamento de instantâneo, por isso, enquanto uma transação estiver em pausa, outras transações deve ser capaz de prosseguir normalmente desde que a transação em pausa não está segurando os bloqueios. Claro que, quando os concluída transação pausados, é provável para detectar um conflito; mas isso é aceitável desde que outros desenvolvedores e os testes automatizados pode prosseguir sem impedimentos.

No entanto, na prática, quando um paradas pessoa uma transação durante a depuração, todos os outros usuários DB tentando acessar as mesmas linhas são bloqueadas apesar de usar nível de isolamento de instantâneo.

Alguém sabe por que isso ocorre, e / ou como eu posso alcançar a verdadeira (bloqueio não) simultaneidade otimista?

A resolução (uma infeliz para mim) : Remus Rusanu observou que os escritores sempre bloquear outros escritores; esta é apoiada por MSDN - não muito sair e dizer assim, mas sempre apenas menciona evitando bloqueios de leitor-escritor. Em suma, o comportamento que eu quero não está implementado no SQL Server.

Foi útil?

Solução

nível de isolamento de INSTANTÂNEO afeta, como todos os níveis de isolamento, só lê. Escreve ainda estão bloqueando o outro. Se você acredita que o que você vê são blocos de ler, então você deve investigar mais e confira os tipos de recursos e nomes de recursos em que o bloqueio ocorre (wait_type e wait_resource em sys.dm_exec_requests ).

Eu não aconselharia a fazer alterações no código, a fim de apoiar um cenário que envolve desenvolvedores olhando para depurador por minutos a fio. Se você acredita que este cenário pode repetir na produção (ie. Trava cliente), então é uma história diferente. Para conseguir o que você quer você deve minimizar escritas e realizar todas as gravações no final da transação, em uma única chamada que commits antes do retorno. Desta forma, nenhum cliente pode segurar X locks por um longo tempo (não pode pendurar mantendo bloqueios X). Na prática, isso é muito difícil de se conseguir e requer muita disciplina por parte de desenvolvedores em como escrever o código de acesso de dados.

Outras dicas

Você olhou para as fechaduras quando um desenvolvedor faz uma pausa a transação? Além disso, apenas ligar o nível de isolamento de instantâneo não tem muito efeito. Você definir ALLOW_SNAPSHOT_ISOLATION ON?

Aqui estão os passos:

ALTER DATABASE <databasename>
SET READ_COMMITTED_SNAPSHOT ON;
GO

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

Depois que o banco de dados foi habilitado para o isolamento de instantâneo, desenvolvedores e usuários devem então solicitar que suas transações ser executado neste modo instantâneo. Isso deve ser feito antes de iniciar uma transação, seja por uma directiva do lado do cliente no objeto de transação ADO.NET ou dentro de sua consulta Transact-SQL usando a seguinte declaração:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Raj

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top