Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 45345|Vastaus: 5

[Lähde] Entity Frameworkin kyselyoptimointi KANSSA(NOLOCK)

[Kopioi linkki]
Julkaistu 6.1.2021 14.52.16 | | | |
Ensinnäkin, tämä artikkeli jaEi lisäämällä WITH(NOLOCK) kyselysuorituskyvyn parantamiseksiSen sijaan data luetaan transaktion eristysmekanismin kautta.

SQL Server -tietokannoissa, kun sama tietokantataulu luetaan ja kirjoitetaan usein samanaikaisesti, syntyy lukitusongelma, eli et voi lukea ennen kuin edellinen insert-, update- ja delete-transaktio on suoritettu, ja sinun täytyy odottaa toimenpiteen valmistumista ennen kuin voit suorittaa select-toiminnon, jotta voidaan estää samanaikaiset operaatiot ja lukea likaista dataa.

SELECT-lause, jossa on WITH (NOLOCK) estotilan ratkaisemiseksi.

Muistiinpano:WITH(NOLOCK)-menetelmän käyttö johtaa epäpuhtaaseen datalukemaan

ef näyttää luodut SQL-lauseet
https://www.itsvse.com/thread-3813-1-1.html
Testikoodi on seuraava:

Käytä Func delegatea paketoidaksesi koodin seuraavasti:

Tuloksena saadaan SQL-lause seuraavasti:

2021-01-06 14:32:09.9505 [ ketju] DEBUG DEBUG LogCenter - sql-lause: VALITSE TOP (1)
    [Laajuus1]. [ID] AS [ID],
    [Laajuus1]. [Nimi] AS [Nimi]
    FROM [dbo]. [Itsvse] AS [Laajuus1]
    MISSÄ ([Extent1].[ Nimi] = @p__linq__0) TAI (([Extent1].[ Nimi] ON NOLLA) JA (@p__linq__0 ON NOLLA))
2021-01-06 14:32:09.9515 [ ketju] DEBUG DEBUG LogCenter - sql-lausunto:

2021-01-06 14:32:09.9525 [ ketju] DEBUG DEBUG LogCenter - sql-lause: -- p__linq__0: 'itsvse.com' (tyyppi = merkkijono, koko = 4000)

2021-01-06 14:32:09.9525 [ ketju] DEBUG DEBUG LogCenter - sql-lause: -- Suoritetaan 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ ketju] DEBUG DEBUG LogCenter - sql-lause: -- Suoritettu 1 ms tuloksella: SqlDataReader

2021-01-06 14:32:09.9555 [ ketju] DEBUG DEBUG LogCenter - sql-lausunto:

2021-01-06 14:32:09.9555 [ketju] DEBUG DEBUG LogCenter - sql-lause: Suljettu yhteys 2021-01-06 14:32:09 +08:00
Select-kysely ei sisällä nolock-avainsanaa.

(Loppu)





Edellinen:.NET/C# toteuttaa yksinkertaisen lokituksen, joka perustuu BlockingCollectioniin
Seuraava:.NET (CLS) julkisen kielen määrittely
 Vuokraisäntä| Julkaistu 6.1.2021 14.53.17 |
Käyttää: Lisää seuraava lause Global.cs:n Application_Start():hen, ja generoitu SQL lisää automaattisesti (nolock)
//ef命令拦截器
DbInterception.Add(uusi WithNoLockInterceptor());
Jos SQL-lause täytyy lukita, lisää seuraava laajennus


1. Korjattiin virheongelma säännöllisissä lausekkeissa Internetissä erityistilanteissa

 Vuokraisäntä| Julkaistu 10.1.2021 10.27.32 |
SQL-skriptien testaus:

Testitulokset:

Oletuksena transaktiota ei lisätä, ja oletuseristystaso on oikea:



Kesto: 17561 millisekuntia

IsolationLevel.ReadUncommitted isolation level, kuten seuraavassa kuvassa näkyy:



Aika: 519 ms

Lähde:



 Vuokraisäntä| Julkaistu 2.5.2023 11.45.35 |
ADO.NET asetukset sallivat likaisen lukemisenReadUncommitted, koodi on seuraava:


On olemassa toinenkin tapa kirjoittaa se, tyylikäs koodi on seuraava:

Kirjoituskokeissa ei ole ongelmia,Suositellaan käyttämään ensimmäistä suoraan!!!


Muita tapoja kirjoittaa:



 Vuokraisäntä| Julkaistu 22.12.2025 13.26.15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Muistiin optimoidut taulut eivät tue transaktioiden eristystasoa "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)
         at Microsoft.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, Boolean isInternal, string endMethod)
         osoitteessa Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
         osoitteessa Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult)
         osoitteessa System.Threading.Tasks.TaskFactory'1.FromAsyncCoreLogic(IAsyncResult iar, Func'2 endFunction, Action'1 endAction, Task'1 promise, Boolean vajaaSynchronization)

SqlTransaction- ja TransactionScope-vuotojen eristystasot(The.)Bugi on ollut olemassa jo 8 vuotta, toistaiseksi sitä ei ole korjattu! Luulen, että monet ihmiset saattavat kärsiä siitä huomaamattaan):Hyperlinkin kirjautuminen on näkyvissä.
Kysy SQL-lause nykyisellä istunnon eristystasolla seuraavasti:

 Vuokraisäntä| Julkaistu 23.12.2025 8.53.39 |
ReadUncommitted BeginTransaction -toiminnon käyttö voi aiheuttaa likaisia lukuja transaktion ulkopuolisissa kyselyissä:Hyperlinkin kirjautuminen on näkyvissä.
Kun yhteys suljetaan, transaktioiden eristystasoa ei nollaudu:Hyperlinkin kirjautuminen on näkyvissä.
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com