Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 44050|Resposta: 3

[Fonte] Otimização de Consultas do Entity Framework WITH(NOLOCK)

[Copiar link]
Postado em 2021-1-6 14:52:16 | | | |
Primeiramente, este artigo eNão adicionando WITH(NOLOCK) para melhorar o desempenho da consultaEm vez disso, os dados são lidos através do mecanismo de isolamento da transação.

Em bancos de dados SQL Server, quando a mesma tabela de banco é frequentemente lida e escrita ao mesmo tempo, haverá um problema de bloqueio, ou seja, você não pode ler até que a transação anterior de inserção, atualização e exclusão seja concluída, e você deve esperar até que a operação seja concluída para poder realizar a operação de seleção, a fim de evitar operações simultâneas e ler dados sujos.

SELECT com WITH (NOLOCK) para resolver o bloqueio de bloqueio.

Nota:Usar WITH(NOLOCK) resultará em leitura de dados suja

ef exibe as instruções SQL geradas
https://www.itsvse.com/thread-3813-1-1.html
O código do teste é o seguinte:

Use o delegado Func para empacotar o código da seguinte forma:

A instrução SQL resultante é a seguinte:

2021-01-06 14:32:09.9505 [thread] DEBUG DEBUG LogCenter - declaração sql: SELECT TOP (1)
    [Extensão1]. [ID] COMO [ID],
    [Extensão1]. [Nome] AS [Nome]
    DE [dbo]. [Itsvse] COMO [Extensão1]
    ONDE ([Extensão1].[ Nome] = @p__linq__0) OU (([Extensão1].[ Nome] É NULO) E (@p__linq__0 É NULO))
2021-01-06 14:32:09.9515 [ thread] DEBUG DEBUG LogCenter - declaração sql:

06-01-2021 14:32:09.9525 [thread] DEBUG DEBUG LogCenter - instrução sql: -- p__linq__0: 'itsvse.com' (tipo = string, tamanho = 4000)

2021-01-06 14:32:09.9525 [ thread] DEBUG DEBUG LogCenter - instrução sql: -- Executando em 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ thread] DEBUG DEBUG LogCenter - instrução sql: -- Concluído em 1 ms com resultado: SqlDataReader

2021-01-06 14:32:09.9555 [ thread] DEBUG DEBUG LogCenter - instrução sql:

2021-01-06 14:32:09.9555 [ thread] DEBUG DEBUG LogCenter - declaração sql: Conexão fechada em 2021-01-06 14:32:09 +08:00
A consulta select não inclui a palavra-chave nolock.

(Fim)





Anterior:.NET/C# implementa logs simples baseados no BlockingCollection
Próximo:Especificação da linguagem pública .NET (CLS)
 Senhorio| Postado em 2021-1-6 14:53:17 |
Uso: Adicione a seguinte instrução ao Application_Start() do Global.cs, e o SQL gerado automaticamente adicionará with(nolock)
//ef命令拦截器
DbInterception.Add (novo WithNoLockInterceptor());
Se a instrução SQL precisar ser bloqueada, adicione a seguinte extensão


1. Corrigiu o problema de erro das expressões regulares fornecidas na Internet sob circunstâncias especiais

 Senhorio| Postado em 2021-1-10 10:27:32 |
Testando scripts SQL:

Resultados do teste:

Nenhuma transação é adicionada por padrão, e o nível de isolamento padrão está correto:



Duração: 17561 milissegundos

IsolationLevel.ReadUncommitted nível de isolamento, conforme mostrado na imagem a seguir:



Tempo: 519 ms

Fonte:



 Senhorio| Postado em 2023-05-2 11:45:35 |
ADO.NET configurações permitem leitura sujaReadUncommitted, o código é o seguinte:


Existe outra forma de escrevê-lo, o código elegante é o seguinte:

Não há problemas com ambas as provas de escrita,Recomenda-se usar o primeiro diretamente!!!


Outras formas de escrever:



Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com