Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 45345|Odpověď: 5

[Zdroj] Optimalizace dotazů v rámci entity s POMOCÍ NOLOCK)

[Kopírovat odkaz]
Zveřejněno 06.01.2021 14:52:16 | | | |
Především tento článek aNe přidáním WITH(NOLOCK) pro zlepšení výkonu dotazůMísto toho jsou data čtena skrze izolační mechanismus transakce.

V databázích SQL Serveru, když je stejná databázová tabulka často čtena a zapisována současně, dochází k problému se zablokováním, tedy nelze číst, dokud není dokončena předchozí transakce vložení, aktualizace a mazání, a musíte počkat, až operace bude dokončena, než můžete provést operaci select, abyste zabránili souběžným operacím a čtení špinavých dat.

Příkaz SELECT pomocí WITH (NOLOCK) k vyřešení blokovacího zablokování.

Poznámka:Použití WITH(NOLOCK) vede k nekvalitnímu čtení dat

ef zobrazuje generované SQL příkazy
https://www.itsvse.com/thread-3813-1-1.html
Testovací kód je následující:

Použijte Func delegate k zabalení kódu následovně:

Výsledný SQL příkaz je následující:

2021-01-06 14:32:09.9505 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz: SELECT TOP (1)
    [Extent1]. [ID] JAKO [ID],
    [Extent1]. [Jméno] AS [Jméno]
    FROM [dbo]. [Itsvse] AS [Extent1]
    KDE ([Extent1].[ Název] = @p__linq__0) NEBO (([Extent1].[ Název] JE NULL) A (@p__linq__0 JE NULL))
2021-01-06 14:32:09.9515 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz:

2021-01-06 14:32:09.9525 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz: -- p__linq__0: 'itsvse.com' (type = string, size = 4000)

2021-01-06 14:32:09.9525 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz: -- Spuštěno dne 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz: -- Dokončeno za 1 ms s výsledkem: SqlDataReader

2021-01-06 14:32:09.9555 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz:

2021-01-06 14:32:09.9555 [ vlákno] DEBUG DEBUG LogCenter - sql příkaz: Uzavřené spojení dne 2021-01-06 14:32:09 +08:00
Select dotaz neobsahuje klíčové slovo nolock.

(Konec)





Předchozí:.NET/C# implementuje jednoduché logování založené na BlockingCollection
Další:Specifikace veřejného jazyka .NET (CLS)
 Pronajímatel| Zveřejněno 06.01.2021 14:53:17 |
Použijte: Přidejte následující příkaz do Application_Start() Global.cs a vygenerovaný SQL automaticky přidá with(nolock)
//ef命令拦截器
DbInterception.Add(new WithNoLockInterceptor());
Pokud je potřeba SQL příkaz uzamknout, přidejte následující rozšíření


1. Opraven problém chyb regulárních výrazů poskytovaných na internetu za zvláštních okolností

 Pronajímatel| Zveřejněno 10.01.2021 10:27:32 |
Testování SQL skriptů:

Výsledky testů:

Ve výchozím nastavení se žádná transakce nepřidává a výchozí úroveň izolace je správná:



Délka: 17561 milisekund

IsolationLevel.ReadNezavázaná úroveň izolace, jak je znázorněno na následujícím obrázku:



Čas: 519 ms

Zdroj:



 Pronajímatel| Zveřejněno 02.05.2023 11:45:35 |
ADO.NET nastavení umožňuje nekvalitní čteníReadUncommitment, kód je následující:


Existuje i jiný způsob, jak to napsat, dapper kód je následující:

S oběma písemnými testy nejsou žádné problémy,Doporučuje se používat první přímo!!!


Další způsoby psaní:



 Pronajímatel| Zveřejněno 22.12.2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Tabulky optimalizované pro paměť nepodporují úroveň transakční izolace "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 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)

Úrovně izolace úniku SqlTransaction a TransactionScope(The.)Chyba tu je už 8 let, zatím nebyl opraven! Myslím, že mnoho lidí může být ovlivněno, aniž by si to uvědomovali):Přihlášení k hypertextovému odkazu je viditelné.
Dotazujte SQL příkaz na aktuální úrovni izolace relace následovně:

 Pronajímatel| Zveřejněno 23.12.2025 8:53:39 |
Používání ReadUncommitted BeginTransaction může způsobit nekvalitní čtení u dotazů mimo transakci:Přihlášení k hypertextovému odkazu je viditelné.
Když je spojení uzavřeno, úroveň izolace transakce se neresetuje:Přihlášení k hypertextovému odkazu je viditelné.
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com