No momento, estamos encontrando um problema com nosso aplicativo ASP.NET que resulta em bloqueios no banco de dados do SQL Server. Um pouco de informação de fundo que posso fornecer é que dependemos muito de retornos de chamada AJAX.
O problema ocorre em uma página com vários "campos" que contêm informações sobre um recurso. O usuário pode clicar em cada campo para transformá-lo em "modo de edição" que permite a alteração de dados. Basicamente o que isso faz é abrir uma transação, salvar o item, atualizar o html e fechar a transação.
O usuário pode alterar os dados e salvar as alterações novamente com uma transação. Também temos botões que podem ser pressionados para acionar scripts (código dinâmico C#) que executam uma nova transação.
Abaixo está uma pequena transcrição de dois tópicos em execução em tal cenário e o que eles estão fazendo.
*Tópico 1*
Step 1. SET TRANSACTION ISOLATION LEVEL read committed
Step 2. begin transaction
Step 3. update Person set Name = 'Person1' where itemId = 801
Step 7. update Person set Name = 'Person3' where itemId = 801
Step x. commit transaction
*Tópico 2*
Step 4. SET TRANSACTION ISOLATION LEVEL read committed
Step 5. begin transaction
Step 6. update Person set Name = 'Person2' where itemId = 801
Step x. commit transaction
Depois de executar a etapa 7, você receberá um impasse.
> Transaction (Process ID 124) was deadlocked on lock resources with
> another process and has been chosen as the deadlock victim. Rerun the
> transaction.
No momento, estamos investigando como os impasses estão funcionando no SQL Server e como podemos evitá-los de nossa parte, mas qualquer entrada/conselho sobre o que fazer/verificar é bem-vindo.
Se forem necessárias informações adicionais, posso adicioná-las, desde que não estejam violando nossas regras aqui no trabalho.
Como resolver impasses depende inteiramente de seus requisitos de dados.
Você está satisfeito em aplicar apenas a última atualização aos dados?
Nesse caso, não use nenhuma transação - isso acontecerá automaticamente.
Todo usuário precisa ver as atualizações reais sendo aplicadas apenas para esse usuário?
Isso é o que você está tentando atualmente, incluindo (ugh) manter uma transação aberta enquanto espera em uma página da web , de todas as coisas.
Eu começaria investigando a necessidade real de fazer essa coisa tão ruim...
Independentemente do objetivo final, as transações explícitas devem ser usadas esparsamente, com sabedoria e com boas razões.