Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 44050|Відповідь: 3

[Джерело] Оптимізація запитів до фреймворку сутностей 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 [ thread] DEBUG DEBUG LogCenter - sql-оператор: SELECT TOP (1)
    [Extent1]. [ID] ЯК [ID],
    [Extent1]. [Ім'я] AS [Ім'я]
    ВІД [dbo]. [Іце] AS [Extent1]
    ДЕ ([Extent1].[ Назва] = @p__linq__0) АБО (([Extent1].[ Ім'я] Є NULL) та (@p__linq__0 Є NULL))
2021-01-06 14:32:09.9515 [ thread] DEBUG DEBUG LogCenter - sql-оператор:

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

2021-01-06 14:32:09.9525 [ thread] DEBUG DEBUG LogCenter - sql-оператор: -- Виконується о 2021-01-06 14:32:09 +08:00

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

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

2021-01-06 14:32:09.9555 [ thread] 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:27:32 |
Тестування SQL-скриптів:

Результати тестів:

За замовчуванням транзакція не додається, і рівень ізоляції за замовчуванням правильний:



Тривалість: 17561 мілісекунда

IsolationLevel.ReadUncommitted isolation level, як показано на наступному зображенні:



Час: 519 мс

Джерело:



 Орендодавець| Опубліковано 2023-5-2 11:45:35 |
ADO.NET налаштування дозволяють брудне читанняReadUncommitted, код виглядає так:


Існує й інший спосіб написання, даппер-код виглядає так:

З обома письмовими тестами немає проблем,Рекомендується використовувати перший напряму!!!


Інші способи написання:



Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com