See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 45345|Vastuse: 5

[Allikas] Entity Framework päringute optimeerimine WITH(NOLOCK)

[Kopeeri link]
Postitatud 06.01.2021 14:52:16 | | | |
Esiteks, see artikkel jaMitte WITH(NOLOCK) lisamisega, et parandada päringute jõudlustSelle asemel loetakse andmeid läbi tehingu isoleerimismehhanismi.

SQL Serveri andmebaasides, kui sama andmebaasitabelit loetakse ja kirjutatakse sageli samaaegselt, tekib lukustusprobleem, st sa ei saa lugeda enne, kui eelmine sisestamise, uuendamise ja kustutamise tehing on lõpetatud, ning pead ootama, kuni operatsioon on lõpetatud, enne kui saad valiku operatsiooni sooritada, et vältida samaaegseid operatsioone ja lugeda musta andmet.

SELECT lause koos WITH (NOLOCK) blokeerimise ummikseisu lahendamiseks.

Märkus:WITH(NOLOCK) kasutamine põhjustab musta andmelugemise

ef kuvab genereeritud SQL-laused
https://www.itsvse.com/thread-3813-1-1.html
Testkood on järgmine:

Kasuta Func delegate'i, et pakendada kood järgmiselt:

Tulemuseks olev SQL-lause on järgmine:

2021-01-06 14:32:09.9505 [ teema] DEBUG DEBUG LogCenter - sql lause: SELECT TOP (1)
    [Ulatus1]. [ID] KUI [ID],
    [Ulatus1]. [Nimi] AS [Nimi]
    FROM [dbo]. [Itsvse] AS [Ulatus1]
    KUS ([Extent1].[ Nimi] = @p__linq__0) VÕI (([Extent1].[ Nimi] ON NULL) JA (@p__linq__0 ON NULL))
2021-01-06 14:32:09.9515 [ teema] DEBUG DEBUG LogCenter - sql avaldus:

2021-01-06 14:32:09.9525 [ teema] DEBUG DEBUG LogCenter - sql lause: -- p__linq__0: 'itsvse.com' (tüüp = string, suurus = 4000)

2021-01-06 14:32:09.9525 [ teema] DEBUG DEBUG LogCenter - sql lause: -- Täitmine 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ teema] DEBUG DEBUG LogCenter - sql lause: -- Lõpetatud 1 ms jooksul, tulemus: SqlDataReader

2021-01-06 14:32:09.9555 [ teema] DEBUG DEBUG LogCenter - sql avaldus:

2021-01-06 14:32:09.9555 [ teema] DEBUG DEBUG LogCenter - sql avaldus: Suletud ühendus 2021-01-06 14:32:09 +08:00
Select Query ei sisalda NoLocki märksõna.

(Lõpp)





Eelmine:.NET/C# rakendab lihtsat logimist, mis põhineb BlockingCollectionil
Järgmine:.NET (CLS) avaliku keele spetsifikatsioon
 Üürileandja| Postitatud 06.01.2021 14:53:17 |
Kasuta: Lisa järgmine lause Global.cs Application_Start() ja genereeritud SQL lisab automaatselt (nolock)
//ef命令拦截器
DbInterception.Add(uus WithNoLockInterceptor());
Kui SQL-lause tuleb lukustada, lisa järgmine laiendus


1. Parandatud regulaaravaldiste veaprobleem, mis on internetis eritingimustel kättesaadavad

 Üürileandja| Postitatud 10.01.2021 10:27:32 |
SQL-skriptide testimiseks:

Testitulemused:

Vaikimisi ei lisata tehingut ja vaikimisi isolatsioonitase on õige:



Kestus: 17561 millisekundit

IsolationLevel.ReadUncommitted isolation level, nagu näidatud järgmisel pildil:



Aeg: 519 ms

Allikas:



 Üürileandja| Postitatud 02.05.2023 11:45:35 |
ADO.NET seaded lubavad musta lugemistReadUncommitted, kood on järgmine:


On ka teine viis seda kirjutada, dapper kood on järgmine:

Mõlema kirjutamistestiga pole probleeme,Soovitatav on kasutada esimest otse!!!


Teised kirjutamisviisid:



 Üürileandja| Postitatud 22.12.2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Mälule optimeeritud tabelid ei toeta tehingute isoleerimise taset "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)
         aadressil System.Threading.Tasks.TaskFactory'1.FromAsyncCoreLogic(IAsyncResult iar, Func'2 endFunction, Action'1 endAction, Task'1 promise, Boolean vajabSynchronization)

SqlTransaction ja TransactionScope lekkeisolatsioonitasemed(See.)See viga on olnud olemas juba 8 aastat, seni pole seda parandatud! Arvan, et paljud inimesed võivad seda märkamata mõjutada):Hüperlingi sisselogimine on nähtav.
Küsige SQL-lauset praegusel sessiooni isolatsioonitasemel järgmiselt:

 Üürileandja| Postitatud 23.12.2025 08:53:39 |
ReadUncommitted BeginTransaction kasutamine võib põhjustada räpaseid lugemisi tehinguväliste päringute puhul:Hüperlingi sisselogimine on nähtav.
Kui ühendus suletakse, ei lähtesta tehingute isolatsioonitase:Hüperlingi sisselogimine on nähtav.
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com