Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 45345|Отговор: 5

[Източник] Оптимизация на заявки за Entity Framework WITH(NOLOCK)

[Копирай линк]
Публикувано в 6.01.2021 г. 14:52:16 ч. | | | |
Първо, тази статия иНе чрез добавяне на WITH(NOLOCK) за подобряване на производителността на заявкитеВместо това данните се четат чрез механизма за изолация на транзакцията.

В SQL Server базите данни, когато една и съща таблица често се чете и пише едновременно, възниква проблем с заключването, тоест не можете да четете, докато не приключите предишната транзакция за вмъкване, обновяване и изтриване, и трябва да изчакате операцията да приключи, преди да изпълните операцията select, за да предотвратите едновременни операции и да прочетете мръсни данни.

Операторът SELECT с WITH (NOLOCK) за решаване на блокиращата задънена ситуация.

Бележка:Използването на WITH(NOLOCK) ще доведе до мръсно четене на данни

ef показва генерираните SQL оператори
https://www.itsvse.com/thread-3813-1-1.html
Тестовият код е следният:

Използвайте Func делегат, за да опаковате кода по следния начин:

Полученото SQL изявление е следното:

2021-01-06 14:32:09.9505 [ тема] DEBUG DEBUG LogCenter - sql оператор: SELECT TOP (1)
    [Extent1]. [ID] КАТО [ID],
    [Extent1]. [Име] AS [Име]
    ОТ [dbo]. [Itsvse] AS [Extent1]
    КЪДЕТО ([Extent1].[ Име] = @p__linq__0) ИЛИ (([Extent1].[ Име] Е NULL) и (@p__linq__0 Е NULL))
2021-01-06 14:32:09.9515 [ тема] DEBUG DEBUG LogCenter - sql оператор:

2021-01-06 14:32:09.9525 [ тема] DEBUG DEBUG LogCenter - sql оператор: -- p__linq__0: 'itsvse.com' (тип = низ, размер = 4000)

2021-01-06 14:32:09.9525 [ нишка] DEBUG DEBUG LogCenter - sql оператор: -- Изпълнява се на 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ нишка] DEBUG DEBUG LogCenter - sql оператор: -- Завършено за 1 ms с резултат: SqlDataReader

2021-01-06 14:32:09.9555 [ тема] DEBUG DEBUG LogCenter - sql оператор:

2021-01-06 14:32:09.9555 [ тема] DEBUG DEBUG LogCenter - sql оператор: Затворена връзка на 2021-01-06 14:32:09 +08:00
Select Query не включва ключовата дума nolock.

(Край)





Предишен:.NET/C# реализира прост лог, базиран на BlockingCollection
Следващ:.NET (CLS) спецификация за публичен език
 Хазяин| Публикувано в 6.01.2021 г. 14:53:17 ч. |
Използвай: Добави следното изявление към Application_Start() на Global.cs и генерираният SQL автоматично ще добави with(nolock)
//ef命令拦截器
DbInterception.Add (нов с NoLock Interceptor());
Ако SQL операторът трябва да бъде заключен, добавете следното разширение


1. Поправен е проблемът с грешките при регулярни изрази, предоставяни в интернет при специални обстоятелства

 Хазяин| Публикувано в 10.01.2021 г. 10:27:32 ч. |
Тестване на SQL скриптове:

Резултати от тестовете:

По подразбиране не се добавя транзакция, а нивото на изолация по подразбиране е правилно:



Продължителност: 17561 милисекунди

IsolationLevel.ReadUncommitted isolation level, както е показано на следното изображение:



Време: 519 ms

Източник:



 Хазяин| Публикувано в 2.05.2023 г. 11:45:35 ч. |
ADO.NET настройки позволяват мръсно четенеReadUncommitted, кодът е следният:


Има и друг начин да се напише – елегантният код е следният:

Няма проблеми и с двата писмени теста,Препоръчва се първата да се използва директно!!!


Други начини за писане:



 Хазяин| Публикувано в 22.12.2025 г. 13:26:15 ч. |
Microsoft.Data.SqlClient.SqlException (0x80131904): Таблиците, оптимизирани за паметта, не поддържат ниво на изолация на транзакции "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 bulkCopyHandleler, TdsParserStateObject stateObj, Boolean& dataReady)
         at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, булев трябваCacheForAlwaysEncrypted)
         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)

Нива на изолация на течове в SqlTransaction и TransactionScope(The.)Бъгът съществува вече 8 години, досега не е ремонтиран! Предполагам, че много хора може да са засегнати, без да осъзнават):Входът към хиперлинк е видим.
Направете заявка към SQL изявлението на текущото ниво на сесия по следния начин:

 Хазяин| Публикувано в 23.12.2025 г. 8:53:39 ч. |
Използването на ReadUncommitted BeginTransaction може да предизвика мръсни четения за заявки извън транзакцията:Входът към хиперлинк е видим.
Когато връзката е затворена, нивото на изолация на транзакцията не се нулира:Входът към хиперлинк е видим.
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com