@lekaverta

Deadlock usando TransactionScope

Published on 09/03/2013

“Transaction (Process ID 666) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.”

Ainda no projeto utilizando SOA, fase de teste de performance, eu obtive um problema cabalistico onde, se um consumidor pedisse muita informação, o que ocorre, o tempo de resposta aumentaria exponencialmente. No fim de simulaçoes para carai, a solução foi paralelizar o processamento (beijo parallel.foreach).
Feito alguns stress, comecou a acontecer o erro que inicia o artigo: DREADLOCK!

Quando eu estava inserindo um registro em uma tabela, outro serviço nao conseguia dar um select na mesma, cheirava a lock de tabela.
Solução? (apos um tico de sofrimento)

SNAPSHOT ISOLATION LEVEL no TrasactionScope!

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.Snapshot;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
}

Como o registro que eu estava inserindo NUNCA seria selecionado ao mesmo tempo, leriamos apenas registros antes dele. A isolacao da tabela enquanto estou executando esta transacao é feita deixando para leitura uma snapshot antes do insert. Magnifico nao?

E aproveitando o momento SQL supremo, agreguem esse blog ai no feed que é vida: http://www.brentozar.com/blog.

Enjoy!

Filed under: .NET, Bando de dados, Day-by-day
Tags: , ,

Comments are closed.