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

Изглед: 44050|Отговор: 3

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

[Копирай линк]
Публикувано на 2021-1-6 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) спецификация за публичен език
 Хазяин| Публикувано на 2021-1-6 14:53:17 |
Използвай: Добави следното изявление към Application_Start() на Global.cs и генерираният SQL автоматично ще добави with(nolock)
//ef命令拦截器
DbInterception.Add (нов с NoLock Interceptor());
Ако SQL операторът трябва да бъде заключен, добавете следното разширение


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

 Хазяин| Публикувано на 2021-1-10 10:32 |
Тестване на SQL скриптове:

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

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



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

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



Време: 519 ms

Източник:



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


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

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


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



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

Mail To:help@itsvse.com