Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 45345|Odgovoriti: 5

[Vir] Optimizacija poizvedb v okviru entitete Z (NOLOCK)

[Kopiraj povezavo]
Objavljeno na 6. 01. 2021 14:52:16 | | | |
Najprej, ta članek inNe z dodajanjem WITH(NOLOCK) za izboljšanje zmogljivosti poizvedbNamesto tega se podatki preberejo skozi izolacijski mehanizem transakcije.

V bazah SQL Server, ko se ista tabela podatkov pogosto bere in piše hkrati, pride do težave z zaklepom, torej ne morete brati, dokler prejšnja transakcija vstavljanja, posodobitve in brisanja ni zaključena, in morate počakati, da je operacija zaključena, preden lahko izvedete izbirno operacijo, da preprečite sočasne operacije in branje umazanih podatkov.

Ukaz SELECT z WITH (NOLOCK) za rešitev blokade zastoja.

Opomba:Uporaba WITH(NOLOCK) bo povzročila umazano branje podatkov

ef prikazuje generirane SQL stavke
https://www.itsvse.com/thread-3813-1-1.html
Testna koda je naslednja:

Uporabite Func delegate za pakiranje kode na naslednji način:

Nastala SQL izjava je naslednja:

2021-01-06 14:32:09.9505 [ tema] DEBUG DEBUG LogCenter - sql izjava: SELECT TOP (1)
    [Extent1]. [ID] KOT [ID],
    [Extent1]. [Ime] AS [Ime]
    IZ [dbo]. [Itsvse] AS [Obseg1]
    KJER ([Extent1].[ Ime] = @p__linq__0) ALI (([Extent1].[ Ime] JE NULL) IN (@p__linq__0 JE NULL))
2021-01-06 14:32:09.9515 [ nit] DEBUG DEBUG LogCenter - sql izjava:

2021-01-06 14:32:09.9525 [ nit] DEBUG DEBUG LogCenter - sql stavek: -- p__linq__0: 'itsvse.com' (type = string, size = 4000)

2021-01-06 14:32:09.9525 [ nit] DEBUG DEBUG LogCenter - sql izjava: -- Izvaja se 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ nit] DEBUG DEBUG LogCenter - sql stavek: -- Zaključeno v 1 ms z rezultatom: SqlDataReader

2021-01-06 14:32:09.9555 [ tema] DEBUG DEBUG LogCenter - sql izjava:

2021-01-06 14:32:09.9555 [ tema] DEBUG DEBUG LogCenter - sql izjava: Zaprta povezava na 2021-01-06 14:32:09 +08:00
Select poizvedba ne vključuje ključne besede nolock.

(Konec)





Prejšnji:.NET/C# izvaja preprosto beleženje na osnovi BlockingCollection
Naslednji:Specifikacija javnega jezika .NET (CLS)
 Najemodajalec| Objavljeno na 6. 01. 2021 14:53:17 |
Uporabite: Dodajte naslednjo izjavo v Application_Start() Global.cs in generirani SQL bo samodejno dodal with(nolock)
//ef命令拦截器
DbInterception.Add(new WithNoLockInterceptor());
Če je treba SQL ukaz zakleniti, dodajte naslednjo razširitev


1. Odpravil je problem napak regularnih izrazov, ki so bili na voljo na internetu v posebnih okoliščinah

 Najemodajalec| Objavljeno na 10. 01. 2021 10:27:32 |
Testiranje SQL skript:

Rezultati testov:

Privzeto ni dodana nobena transakcija, privzeta raven izolacije pa je pravilna:



Trajanje: 17561 milisekund

IsolationLevel.ReadNezavezana stopnja izolacije, kot je prikazano na naslednji sliki:



Čas: 519 ms

Izvir:



 Najemodajalec| Objavljeno na 2. 05. 2023 11:45:35 |
ADO.NET nastavitve dovoljujejo umazano branjeReadUncommitted, koda je naslednja:


Obstaja še en način pisanja, elegantna koda je naslednja:

Pri obeh pisnih testih ni težav,Priporočljivo je, da prvo uporabljate neposredno!!!


Drugi načini pisanja:



 Najemodajalec| Objavljeno na 22. 12. 2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Tabele, optimizirane za pomnilnik, ne podpirajo izolacije transakcij na ravni "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)
         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)

Ravni izolacije puščanja SqlTransaction in TransactionScope(The.)Ta hrošč obstaja že 8 let, do zdaj ni bil popravljen! Mislim, da je veliko ljudi prizadetih, ne da bi se tega zavedali):Prijava do hiperpovezave je vidna.
Poizvedite SQL izjavo na trenutni ravni izolacije seje na naslednji način:

 Najemodajalec| Objavljeno na 23. 12. 2025 08:53:39 |
Uporaba ReadUncommitted BeginTransaction lahko povzroči umazane branje pri izvedbah izven transakcije:Prijava do hiperpovezave je vidna.
Ko je povezava zaprta, se stopnja izolacije transakcije ne ponastavi:Prijava do hiperpovezave je vidna.
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com