Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 45345|Respuesta: 5

[Fuente] Optimización de consultas del Entity Framework WITH(NOLOCK)

[Copiar enlace]
Publicado en 6/1/2021 14:52:16 | | | |
En primer lugar, este artículo yNo añadiendo WITH(NOLOCK) para mejorar el rendimiento de las consultasEn su lugar, los datos se leen a través del mecanismo de aislamiento de la transacción.

En las bases de datos SQL Server, cuando la misma tabla de base de datos se lee y escribe frecuentemente al mismo tiempo, habrá un problema de bloqueo, es decir, no se puede leer hasta que se complete la transacción anterior de insertar, actualizar y eliminar, y debe esperar a que se complete la operación para poder realizar la operación de selección, con el fin de evitar operaciones concurrentes y leer datos sucios.

SELECT con WITH (NOLOCK) para resolver el bloqueo bloqueante.

Nota:Usar WITH(NOLOCK) resultará en lecturas de datos corruptas

ef muestra las sentencias SQL generadas
https://www.itsvse.com/thread-3813-1-1.html
El código de prueba es el siguiente:

Utiliza Func delegate para empaquetar el código de la siguiente manera:

La sentencia SQL resultante es la siguiente:

2021-01-06 14:32:09.9505 [ hilo] DEBUG DEBUG LogCenter - declaración sql: SELECT TOP (1)
    [Extensión1]. [ID] COMO [ID],
    [Extensión1]. [Nombre] AS [Nombre]
    DE [dbo]. [Itsvse] COMO [Extensión1]
    DONDE ([Extensión1].[ Nombre] = @p__linq__0) O (([Extensión1].[ Name] ES NULO) Y (@p__linq__0 ES NULO))
2021-01-06 14:32:09.9515 [ hilo] DEBUG DEBUG LogCenter - declaración sql:

06-01-2021 14:32:09.9525 [ hilo] DEBUG DEBUG LogCenter - sentencia sql: -- p__linq__0: 'itsvse.com' (tipo = cadena, tamaño = 4000)

2021-01-06 14:32:09.9525 [ hilo] DEBUG DEBUG LogCenter - sentencia sql: -- Ejecutándose a las 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ hilo] DEBUG DEBUG LogCenter - declaración sql: -- Completado en 1 ms con resultado: SqlDataReader

2021-01-06 14:32:09.9555 [ hilo] DEBUG DEBUG LogCenter - declaración sql:

2021-01-06 14:32:09.9555 [ hilo] DEBUG DEBUG LogCenter - declaración sql: Conexión cerrada a las 2021-01-06 14:32:09 +08:00
Consulta select no incluye la palabra clave nolock.

(Fin)





Anterior:.NET/C# implementa un registro sencillo basado en BlockingCollection
Próximo:Especificación del lenguaje público .NET (CLS)
 Propietario| Publicado en 6/1/2021 14:53:17 |
Usar: Añadir la siguiente sentencia a la Application_Start() del Global.cs, y el SQL generado añadirá automáticamente with(nolock)
//ef命令拦截器
DbInterception.Add (nuevo WithNoLockInterceptor());
Si la sentencia SQL necesita ser bloqueada, añade la siguiente extensión


1. Solucionó el problema de error de las expresiones regulares proporcionadas en Internet bajo circunstancias especiales

 Propietario| Publicado en 10/1/2021 10:27:32 |
Pruebas de scripts SQL:

Resultados de las pruebas:

No se añade ninguna transacción por defecto, y el nivel de aislamiento por defecto es correcto:



Duración: 17561 milisegundos

IsolationLevel.ReadUncommitted isolation level, como se muestra en la siguiente imagen:



Tiempo: 519 ms

Fuente:



 Propietario| Publicado en 2/5/2023 11:45:35 |
ADO.NET ajustes permiten lectura suciaLeerUncommitted, el código es el siguiente:


Hay otra forma de escribirlo, el código elegante es el siguiente:

No hay problemas con ambos exámenes de escritura,Se recomienda usar directamente el primero!!!


Otras formas de escribir:



 Propietario| Publicado en 22/12/2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Las tablas optimizadas para memoria no soportan el nivel de aislamiento de transacciones "READ UNCOMMITTED".
         at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
         en 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)
         en Microsoft.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader(Boolean isInternal, boolean forDescribeParameterEncryption)
         at Microsoft.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, Boolean isInternal, String endMethod)
         en Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
         en Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult)
         en System.Threading.Tasks.TaskFactory'1.FromAsyncCoreLogic(IAsyncResult iar, Func'2 endFunction, Action'1 endAction, Task'1 promise, Boolean requiresSynchronization)

Niveles de aislamiento de fugas de SqlTransaction y TransactionScope(El.)El bicho lleva existiendo 8 años¡Hasta ahora no se ha reparado! Supongo que mucha gente puede verse afectada sin darse cuenta):El inicio de sesión del hipervínculo es visible.
Consulta la sentencia SQL al nivel actual de aislamiento de sesión de la siguiente manera:

 Propietario| Publicado en 23/12/2025 8:53:39 |
Usar ReadUncommitted BeginTransaction puede causar lecturas sucias para consultas fuera de la transacción:El inicio de sesión del hipervínculo es visible.
Cuando la conexión se cierra, el nivel de aislamiento de la transacción no se reinicia:El inicio de sesión del hipervínculo es visible.
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com