Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 45345|Svar: 5

[Kilde] Entity Framework forespørgselsoptimering WITH(NOLOCK)

[Kopier link]
Opslået på 06/01/2021 14.52.16 | | | |
Først og fremmest, denne artikel ogIkke ved at tilføje WITH(NOLOCK) for at forbedre forespørgselsydelsenI stedet læses dataene gennem transaktionens isolationsmekanisme.

I SQL Server-databaser, når den samme databasetabel ofte læses og skrives samtidig, vil der opstå et låseproblem, det vil sige, at du ikke kan læse, før den forrige indsættelse, opdatering og sletning er gennemført, og du skal vente, til operationen er fuldført, før du kan udføre select-operationen for at forhindre samtidige operationer og læsning af beskidte data.

SELECT-sætningen med WITH (NOLOCK) for at løse blokeringsdeadlocken.

Seddel:Brug af WITH(NOLOCK) vil resultere i ukrypteret datalæsning

ef viser de genererede SQL-sætninger
https://www.itsvse.com/thread-3813-1-1.html
Testkoden er som følger:

Brug Func delegate til at pakke koden som følger:

Den resulterende SQL-sætning er som følger:

2021-01-06 14:32:09.9505 [ tråd] DEBUG DEBUG LogCenter - sql-sætning: SELECT TOP (1)
    [Omfang1]. [ID] SOM [ID],
    [Omfang1]. [Navn] AS [Navn]
    FRA [dbo]. [Itsvse] AS [Extent1]
    HVOR ([Extent1].[ Navn] = @p__linq__0) ELLER (([Omfang1].[ Navn] ER NULL) OG (@p__linq__0 ER NULL))
2021-01-06 14:32:09.9515 [ tråd] DEBUG DEBUG LogCenter - sql-sætning:

2021-01-06 14:32:09.9525 [ tråd] DEBUG DEBUG LogCenter - sql-sætning: -- p__linq__0: 'itsvse.com' (type = streng, size = 4000)

2021-01-06 14:32:09.9525 [ tråd] DEBUG DEBUG LogCenter - sql-sætning: -- Udfører kl. 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ tråd] DEBUG DEBUG LogCenter - sql-sætning: -- Færdiggjort på 1 ms med resultat: SqlDataReader

2021-01-06 14:32:09.9555 [ tråd] DEBUG DEBUG LogCenter - sql-sætning:

2021-01-06 14:32:09.9555 [ tråd] DEBUG DEBUG LogCenter - sql-sætning: Lukket forbindelse kl. 2021-01-06 14:32:09 +08:00
Select Query indeholder ikke Nolock-nøgleordet.

(Slut)





Tidligere:.NET/C# implementerer simpel logning baseret på BlockingCollection
Næste:.NET (CLS) offentlig sprogspecifikation
 Udlejer| Opslået på 06/01/2021 14.53.17 |
Brug: Tilføj følgende sætning til Application_Start() i Global.cs, og den genererede SQL vil automatisk tilføje with(nolock)
//ef命令拦截器
DbInterception.Add(ny WithNoLockInterceptor());
Hvis SQL-udsagnet skal låses, tilføj følgende udvidelse


1. Løste fejlproblemet med regulære udtryk leveret på internettet under særlige omstændigheder

 Udlejer| Opslået på 10/01/2021 10.27.32 |
Test af SQL-scripts:

Testresultater:

Ingen transaktion tilføjes som standard, og standardisolationsniveauet er korrekt:



Varighed: 17561 millisekunder

IsolationLevel.ReadUncommitted isolation level, som vist på følgende billede:



Tid: 519 ms

Kilde:



 Udlejer| Opslået på 02/05/2023 11.45.35 |
ADO.NET indstillinger tillader beskidt læsningLæsUforpligtet, koden er som følger:


Der er en anden måde at skrive det på, dapper-koden er som følger:

Der er ingen problemer med begge at skrive prøver,Det anbefales at bruge den første direkte!!!


Andre måder at skrive på:



 Udlejer| Opslået på 22/12/2025 13.26.15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Hukommelsesoptimerede tabeller understøtter ikke transaktionsisolationsniveau "READ UNCOMMITTED".
         at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
         at 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)
         på Microsoft.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, Boolean isInternal, String endMethod)
         på Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
         på 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 rescribesSynchronization)

SqlTransaction- og TransactionScope-lækageisoleringsniveauer(Den.)Fejlen har eksisteret i 8 år, indtil videre er det ikke blevet repareret! Jeg gætter på, at mange måske bliver påvirket uden at være klar over det):Hyperlink-login er synlig.
Forespørg SQL-sætningen på det nuværende sessionsisolationsniveau som følger:

 Udlejer| Opslået på 23/12/2025 08.53.39 |
Brug af ReadUncommitted BeginTransaction kan forårsage beskidte læsninger for forespørgsler uden for transaktionen:Hyperlink-login er synlig.
Når forbindelsen lukkes, nulstilles transaktionsisolationsniveauet ikke:Hyperlink-login er synlig.
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com