Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 45345|Svar: 5

[Källa] Entity Framework Frågeoptimering WITH(NOLOCK)

[Kopiera länk]
Publicerad på 2021-01-06 14:52:16 | | | |
Först och främst, denna artikel ochInte genom att lägga till WITH(NOLOCK) för att förbättra frågeprestandanIstället läses datan genom transaktionens isoleringsmekanism.

I SQL Server-databaser, när samma databastabell ofta läses och skrivs samtidigt, uppstår ett låsningsproblem, det vill säga att du inte kan läsa förrän föregående insättning, uppdatering och borttagning är slutförd, och du måste vänta tills operationen är klar innan du kan utföra select-operationen, för att förhindra samtidiga operationer och läsa smutsiga data.

SELECT-satsen med WITH (NOLOCK) för att lösa blockeringsdeadlocken.

Not:Att använda WITH(NOLOCK) resulterar i smutsig dataläsning

ef visar de genererade SQL-satserna
https://www.itsvse.com/thread-3813-1-1.html
Testkoden är följande:

Använd Func delegate för att paketera koden enligt följande:

Den resulterande SQL-satsen är följande:

2021-01-06 14:32:09.9505 [ tråd] DEBUG DEBUG LogCenter - sql-sats: SELECT TOP (1)
    [Extent1]. [ID] SOM [ID],
    [Extent1]. [Namn] AS [Namn]
    FRÅN [dbo]. [Itsvse] AS [Extent1]
    DÄR ([Extent1].[ Namn] = @p__linq__0) ELLER (([Extent1].[ Namn] ÄR NULL) OCH (@p__linq__0 ÄR NULL))
2021-01-06 14:32:09.9515 [ tråd] DEBUG DEBUG LogCenter - sql-sats:

2021-01-06 14:32:09.9525 [ tråd] DEBUG DEBUG LogCenter - sql-sats: -- p__linq__0: 'itsvse.com' (typ = sträng, storlek = 4000)

2021-01-06 14:32:09.9525 [ tråd] DEBUG DEBUG LogCenter - sql-sats: -- Körs 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ tråd] DEBUG DEBUG LogCenter - sql-sats: -- Slutförd på 1 ms med resultat: SqlDataReader

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

2021-01-06 14:32:09.9555 [ tråd] DEBUG DEBUG LogCenter - sql-sats: Stängd anslutning kl. 2021-01-06 14:32:09 +08:00
SELECT-fråga inkluderar inte Nolock-nyckelordet.

(Slut)





Föregående:.NET/C# implementerar enkel loggning baserad på BlockingCollection
Nästa:.NET (CLS) public-språkspecifikation
 Hyresvärd| Publicerad på 2021-01-06 14:53:17 |
Användning: Lägg till följande sats i Application_Start() i Global.cs, och den genererade SQL:n kommer automatiskt att lägga till with(nolock)
//ef命令拦截器
DbInterception.Add(ny WithNoLockInterceptor());
Om SQL-satsen behöver låsas, lägg till följande tillägg


1. Löste felproblemet med reguljära uttryck som tillhandahålls på Internet under särskilda omständigheter

 Hyresvärd| Publicerad på 2021-01-10 10:27:32 |
Testning av SQL-skript:

Testresultat:

Ingen transaktion läggs till som standard, och standardnivån för isolering är korrekt:



Varaktighet: 17 561 millisekunder

IsolationLevel.ReadUncommitted isolation level, som visas i följande bild:



Tid: 519 ms

Källa:



 Hyresvärd| Publicerad på 2023-05-02 11:45:35 |
ADO.NET inställningar tillåter smutsig läsningLäs Oengagerad, koden är följande:


Det finns ett annat sätt att skriva det, dapper-koden är följande:

Det finns inga problem med att skriva prov,Det rekommenderas att använda den första direkt!!!


Andra sätt att skriva:



 Hyresvärd| Publicerad på 2025-12-22 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Minnesoptimerade tabeller stöder inte transaktionsisoleringsnivån "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)
         på Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
         på 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)
         på System.Threading.Tasks.TaskFactory'1.FromAsyncCoreLogic(IAsyncResult iar, Func'2 endFunction, Action'1 endAction, Task'1 promise, Boolean rescribesSynchronization)

SqlTransaction- och TransactionScope-läckageisoleringsnivåer(Den.)Buggen har funnits i 8 år, hittills har den inte reparerats! Jag antar att många kan påverkas utan att inse det):Inloggningen med hyperlänken är synlig.
Fråga SQL-satsen på nuvarande sessionsisoleringsnivå enligt följande:

 Hyresvärd| Publicerad på 2025-12-23 08:53:39 |
Att använda ReadUncommitted BeginTransaction kan orsaka smutsiga läsningar för frågor utanför transaktionen:Inloggningen med hyperlänken är synlig.
När anslutningen stängs återställs inte transaktionsisoleringsnivån:Inloggningen med hyperlänken är synlig.
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com