Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 45345|Svare: 5

[Kilde] Entity Framework Spørringsoptimalisering WITH(NOLOCK)

[Kopier lenke]
Publisert på 06.01.2021 14:52:16 | | | |
Først og fremst, denne artikkelen ogIkke ved å legge til WITH(NOLOCK) for å forbedre spørringsytelsenI stedet leses dataene gjennom isolasjonsmekanismen i transaksjonen.

I SQL Server-databaser, når den samme databasetabellen ofte leses og skrives samtidig, vil det oppstå et låseproblem, det vil si at du ikke kan lese før forrige innsetting, oppdatering og sletting er fullført, og du må vente til operasjonen er fullført før du kan utføre select-operasjonen, for å forhindre samtidige operasjoner og lese skitne data.

SELECT-setningen med WITH (NOLOCK) for å løse blokkeringsdeadlocken.

Notat:Bruk av WITH(NOLOCK) vil resultere i skitten datalesing

ef viser de genererte SQL-setningene
https://www.itsvse.com/thread-3813-1-1.html
Testkoden er som følger:

Bruk Func delegate for å pakke koden som følger:

Den resulterende SQL-setningen er som følger:

2021-01-06 14:32:09.9505 [ tråd] DEBUG DEBUG LogCenter - sql-setning: 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-setning:

2021-01-06 14:32:09.9525 [ tråd] DEBUG DEBUG LogCenter - sql-setning: -- p__linq__0: 'itsvse.com' (type = streng, størrelse = 4000)

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

2021-01-06 14:32:09.9545 [ tråd] DEBUG DEBUG LogCenter - sql-setning: -- Fullført på 1 ms med resultat: SqlDataReader

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

2021-01-06 14:32:09.9555 [ tråd] DEBUG DEBUG LogCenter - sql-setning: Lukket tilkobling kl. 2021-01-06 14:32:09 +08:00
Select Query inkluderer ikke nolock-nøkkelordet.

(Slutt)





Foregående:.NET/C# implementerer enkel logging basert på BlockingCollection
Neste:.NET (CLS) offentlig språkspesifikasjon
 Vert| Publisert på 06.01.2021 14:53:17 |
Bruk: Legg til følgende setning i Application_Start() i Global.cs, og den genererte SQL-en vil automatisk legge til med(nolock)
//ef命令拦截器
DbInterception.Add(ny WithNoLockInterceptor());
Hvis SQL-setningen må låses, legg til følgende utvidelse


1. Løste feilproblemet med regulære uttrykk som tilbys på Internett under spesielle omstendigheter

 Vert| Publisert på 10.01.2021 10:27:32 |
Testing av SQL-skript:

Testresultater:

Ingen transaksjon legges til som standard, og standard isolasjonsnivå er korrekt:



Varighet: 17561 millisekunder

IsolationLevel.ReadUncommitted isolasjonsnivå, som vist i følgende bilde:



Tid: 519 ms

Kilde:



 Vert| Publisert på 02.05.2023 11:45:35 |
ADO.NET innstillinger tillater skitten lesingLesUforpliktet, koden er som følger:


Det finnes en annen måte å skrive det på, dapper-koden er som følger:

Det er ingen problemer med begge å skrive prøver,Det anbefales å bruke den første direkte!!!


Andre måter å skrive på:



 Vert| Publisert på 22.12.2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Minneoptimaliserte tabeller støtter ikke transaksjonsisolasjonsnivå "READ UNCOMMITTED".
         at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
         på 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)
         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 rescribesSynchronization)

SqlTransaction- og TransactionScope-nivåene for lekkasjeisolasjon(Den.)Feilen har eksistert i 8 år, så langt er den ikke reparert! Jeg antar at mange kan bli påvirket uten å være klar over det):Innloggingen med hyperkoblingen er synlig.
Spør SQL-setningen på nåværende nivå for sesjonsisolasjon som følger:

 Vert| Publisert på 23.12.2025 08:53:39 |
Bruk av ReadUncommitted BeginTransaction kan forårsake skitne lesninger for spørringer utenfor transaksjonen:Innloggingen med hyperkoblingen er synlig.
Når forbindelsen lukkes, nullstilles ikke transaksjonsisolasjonsnivået:Innloggingen med hyperkoblingen er synlig.
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com