local de alto volume usando ADO.NET TransactionScope vs ExecuteCommand em NOLOCK, READ UNCOMMITTED diretamente?

StackOverflow https://stackoverflow.com/questions/628004

Pergunta

Basta ler este artigo interessante por Omar em seu blog LINQ to SQL resolver impasse Transação e problema de tempo limite de consulta usando descompromissado lê e no final Javed Hasan começaram a discutir com ele sobre sua solução para a situação nolock em um site de alto volume.

Aqui, o problema tentando resolver é, a partir do sentido sql precisamos usar instruções Select com NOLOCK ou o uso SET TRANSACTION nível de leitura UNCOMMITTED, caso contrário, em linhas de alto volume em DB será bloqueado e causar erros. A tecnologia Omar utilizado é Linq2Sql, então a questão é como é que vamos conseguir este alcançado em seu código de acesso de dados C # para que o acima não acontecer?

Basicamente no post, Omar trata de sua solução trabalhando e testando no local mundo real e com ferramentas como SQLProfiler, enquanto Javed Hasan trata de sua solução com documentos MSDN e blog de Scott Hanselman pós etc.

Omar sugere a utilização do seguinte

using (var db = new DropthingsDataContext2())
{
  db.Connection.Open();
  db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");

  var user = db.aspnet_Users.First();
  var pages = user.Pages.ToList();
}

enquanto Javed Hasan sugere

using (new TransactionScope(TransactionScopeOption.Required, 
  new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
 //Your db Operation
}

Estou muito interessado em saber o que vocês lá fora fazer nesta questão em particular em um site de alto volume como o StatckOverflow, ou o que Jeff e suas caras fazer a este respeito?

Editar :. Depois de ler o primeiro post, eu quero salientar algumas coisas no post de Omar

  1. que ele fez para problema de conexão com a sua abordagem, mas ele resolveu, consulte seu posto.
  2. mais importante, ele mencionou que ele tentou a usar maneira ADO.NET Transação e até mesmo tentou o que Scott Hanselman escreveu em seu blog, mas ele não está funcionando para o local de alto volume, que degrada o desempenho um pouco. Omar disse que esta "System.Transactions tem uma sobrecarga significativa. Eu nunca fui capaz de usá-lo em um site de alto volume sem fazer CPU ir 100% e Req / seg descer para 1 / 10th. É feito para aplicações empresariais, e não em alta sites Volume ".
Foi útil?

Solução

Em primeiro lugar evitar favor não confirmadas lê, eles podem causar muitos problemas. Uma abordagem muito melhor é apenas para definir o banco de dados para instantâneo isolamento . Isto é o que Jeff fez .

Jeff basicamente disse: "bla bla bla, ser real, bla bla bla, teóricos de banco de dados, bla bla bla, LEIA UNCOMMITTED pode ser útil para aplicações reais de produção que não precisam de consistência dos dados." Jeff não é um DBA, felizmente existem muitos DBAs aqui no SO.

O problema com a abordagem de Omar é que ele pode vazar ligações com "ler não confirmadas" nível de isolamento para as conexões de piscina, que poderia causar estragos em seu site. Significado declaração aleatória pode ser executado em descompromissado leitura.

abordagem Javed seria muito melhor, porque em MS dispose tem a chance de material de limpeza na conexão.

Editar Se você está tendo problemas de desempenho com a abordagem de Javed você pode olhar para rolar seus próprios gerenciador de transações.

Algumas coisas que você provavelmente vai querer fazer:

  • Mantenha uma pilha de transações correntes
  • Confirmar que você está no segmento criador quando uma transação é confirmada
  • Redefinir o isolamento da transação ao seu estado anterior sobre descarte
  • rollback na dispor se a transação não foi comprometido.
  • Suporte reversões aninhadas.

Outras dicas

Eu sou um desenvolvedor com uma equipe ferramentas no grupo de SQL Server da Microsoft. Muitas aplicações não são super-sensível a consistência transação, especialmente se você escrever um aplicativo que faz relatórios ou algo onde os dados ocasionalmente inconsistente não é o fim do mundo. Claro, se você está escrevendo uma aplicação financeira ou qualquer outra coisa que tem muito pouca tolerância para a inconsistência de dados, você provavelmente vai querer explorar outras soluções.

Se optar por usar descompromissado lê, eu tenho blogou uma solução acessível usando métodos de extensão em C #.

{Impede Minha (pobres) reputação me de postar comentários por isso eu coloquei isso como uma resposta}

Se você usar IsolationLevel via System.Transactions e criar um novo contexto Linq dentro do bloco de transação, SQL Server acaba tentando chamar DTC para coordenar a transação. Isso só aconteceu comigo e foi bastante inesperado.

Em relação às transações em .Net e o efeito colateral (de alguma forma surpreendente) do DTC, este documento Apresentando System.Transactions no 2.0 .NET Framework por Juval Lowy explica as coisas muito bem e ainda é totalmente válido (.Net4). Vale a pena ler. (Eu também teria postar um comentário ... se eu pudesse.)

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