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

Vista: 45345|Resposta: 5

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

[Copiar link]
Publicado em 06/01/2021 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| Publicado em 06/01/2021 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| Publicado em 10/01/2021 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| Publicado em 02/05/2023 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:



 Senhorio| Publicado em 22/12/2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Tabelas otimizadas para memória não suportam o nível de isolamento de transações "READ UNCOMMITTED".
         at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
         em Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
         at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, boolean shouldCacheForAlwaysEncrypted)
         at Microsoft.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader(Boolean isInternal, Boolean forDescribeParameterEncryption)
         at Microsoft.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, Boolean isInternal, String endMethod)
         at Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
         at Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult)
         at System.Threading.Tasks.TaskFactory'1.FromAsyncCoreLogic(IAsyncResult iar, Func'2 endFunction, Action'1 endAction, Task'1 promise, Boolean requiresSynchronization)

Níveis de isolamento de vazamento do SqlTransaction e do TransactionScope(O.)O bug existe há 8 anos, até agora não foi consertado! Acho que muita gente pode ser afetada sem perceber):O login do hiperlink está visível.
Consulte a instrução SQL no nível atual de isolamento da sessão da seguinte forma:

 Senhorio| Publicado em 23/12/2025 08:53:39 |
Usar o ReadUncommitted, o BeginTransaction pode causar leituras sujas para consultas fora da transação:O login do hiperlink está visível.
Quando a conexão é fechada, o nível de isolamento da transação não é resetado:O login do hiperlink está visível.
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