Рівень ізоляції транзакцій у SQL Server та їхній зв'язок із брудними читаннями, неповторюваними, фантомними читаннями тощо (аргументи коду та часові послідовності)
Розуміючи ці проблеми, які можуть виникнути у випадку одночасного доступу до бази даних, ми можемо й надалі розуміти поняття рівня ізоляції бази даних простими словами: як ви хочете ізолювати паралельні транзакції і в якій мірі? Наприклад, якщо брудні читання можна терпіти, або якщо ви не хочете, щоб паралельні транзакції мали брудні читання, їх можна встановити на рівень ізоляції, щоб ізоляція між одночасними транзакціями була слабкою або сильною.
Чим вищий рівень ізоляції, тим менша ймовірність зчитування брудних або неповних даних, але тим серйознішим є погіршення продуктивності в системах з високим рівнем паралелізму. Чим нижчий рівень ізоляції, тим більший покращення продуктивності в паралельній системі, але самі дані можуть бути неповними.
У SQL Server 2012 ви можете встановити рівень ізоляції транзакції (від низького до високого) за допомогою цього синтаксису:
ВСТАНОВИТИ РІВЕНЬ ІЗОЛЯЦІЇ ТРАНЗАКЦІЙ { ЧИТАТИ НЕЗОБОВ'ЯЗАНО | ЧИТАЙТЕ ВІДДАНО | ПОВТОРЮВАНЕ ЧИТАННЯ | ЗНІМОК | СЕРІАЛІЗОВАНИЙ } [ ; ] Спочатку створіть новий тестовий скрипт, створіть базу даних і вставте тестові дані, наступним чином:
Створіть нове вікно A, відкрити транзакцію, виконати операцію оновлення і зачекати 10 секунд перед комітингом, код виглядає так:
Створити нове вікно B, встановіть транзакцію READ UNCOMMITTED (uncommitted read, найнижчий рівень, легка проблема — брудне читання, оскільки він може читати дані, змінені іншими транзакціями, але не зафіксовані). Це робить те саме, що й встановлення (NOLOCK) на таблиці об'єктів операторів SELECT у транзакції. Запит до даних — код виглядає так:
Створити нове вікно C, безпосередньо запитують дані наступним чином:
У свою чергу,Виконайте вікна A, B і C і з'явите, що при оновленні даних вікно B може одразу повернути дані (Можливо, ці дані є брудними), вікно C має чекати, поки вікно A завершиться виконаннямповерне дані, як показано на рисунку нижче:
(Вікно Б)
(Вікно C)
(Кінець)
|