SQL Server - який рівень ізоляції для не блокуючих операторів вибору?


9

У мене є тривала операція (називається, скажімо, T1), яка виконує деякі видалення, оновлення та вставки в таблицю в SQL Server 2008 R2. У той же час, інший процес періодично запускає вибрані оператори з цієї таблиці.

У налаштуваннях ізоляції за замовчуванням (ЧИТАЙТЕ ЗНАЧЕНО, я думаю?) T1 блокує виконання будь-яких операцій вибору, поки транзакція не здійсниться або не буде відмовлена ​​назад.

Що я хотів би побачити - це те, щоб вибрані оператори функціонували на послідовних даних навіть під час трансакції. Я вважаю, що ізоляція SNAPSHOT може допомогти, але я не впевнений, чи рухаюся я в правильному напрямку. Це був би найкращий рівень ізоляції для цієї програми?

По-друге, я не маю ніякого контролю над процесом, який викликає оператори select, але я маю контроль над .NET додатком, який викликає T1. Чи потрібні будь-які зміни рівня ізоляції як для операторів вибору, так і для T1, чи достатньо буде позначити просто T1 як інший рівень ізоляції?

Відповіді:


8

В ідеальному світі у вас є два варіанти: SNAPSHOT та READ COMTITED SNAPSHOT (RCSI). Переконайтеся, що ви розумієте основи рівня ізоляції транзакцій, перш ніж вирішити, який підходить для вашої роботи. Конкретно знайте про різні результати, які ви можете побачити в результаті переходу на RCSI.

Це здається, що це не ідеальний світ, оскільки ви не маєте ніякого контролю над програмою, яка генерує вибрані оператори. У цьому випадку ваш єдиний варіант - ввімкнути RCSI для відповідної бази даних таким чином, що вибрані автоматично використовуватимуть RCSI замість ПРОЧИТАНО ЗАВАНТАЖЕНО.


6

Правильно, використовуйте ізоляцію SNAPSHOT для отримання послідовних, зафіксованих даних до початку транзакції.

ЧИТАЙТЕ НЕЗАБАВЛЕННЯ ізоляція (aka NOLOCK натяк) буде читати dirtz, суперечливі дані

Якщо ввімкнути ізоляцію SNAPSHOT, вона набирає чинності для всіх SELECT, що рухаються вперед. У ALTER DATABASEцьому випадку ви працюєте з READ_COMMITTED_SNAPSHOT

Редагувати: додане посилання + цитата ALTER DATABASE (мій жирний шрифт)

Вмикає параметр Знімок з читанням на рівні бази даних. Коли це ввімкнено, оператори DML починають генерувати версії рядків, навіть коли жодна транзакція не використовує ізоляцію знімків. Після ввімкнення цієї опції транзакції із зазначенням рівня зчитування, допущеного читанням, використовують версію рядків замість блокування. Коли транзакція виконується на рівні ізоляції, зчитуваної зчитуванням, усі висловлювання бачать короткий знімок даних, як вони існують на початку оператора.

І з використання ізоляції знімка (моя смілива)

Параметр бази даних READ_COMMITTED_SNAPSHOT визначає поведінку рівня ізоляції READ COMMITTED за замовчуванням, коли в базі даних включена ізоляція знімків. Якщо ви чітко не вказуєте READ_COMMITTED_SNAPSHOT ON, READ COMMITTED застосовується до всіх неявних транзакцій. Це створює таку саму поведінку, що і встановлення READ_COMMITTED_SNAPSHOT OFF (за замовчуванням). Коли діє READ_COMMITTED_SNAPSHOT OFF, Engine Database використовує спільні блокування для забезпечення рівня ізоляції за замовчуванням. Якщо встановити параметр бази даних READ_COMMITTED_SNAPSHOT значення УВІМКНЕНО, двигун бази даних використовує версію версій і ізоляцію знімків за замовчуванням, замість того, щоб використовувати блокування для захисту даних.

Отже, так.

Увімкнення RCSI дозволяє читачам отримувати послідовні дані і не блокуватися письменниками, які продовжуватимуть використовувати Read Atited


4

Я б запропонував вам прочитати наступне питання та його відповіді: Проблеми з блокуванням бази даних? .

Пошук потрібного рівня ізоляції для використання на рівні db - це найшвидше, що ви можете зробити зараз, щоб допомогти виправити цю проблему, тому що зараз важко змінити всі програми, які торкаються бази даних та змінити їх код. Оскільки ви сказали, що "я не маю ніякого контролю над процесом, який викликає вибрані оператори", найшвидшою відповіддю було б переключити db на рівень читання виділених знімків знімка, щоб не торкатися запитів читання. В іншому випадку вам потрібно буде використовувати рівень ізоляції знімків для сеансів, які читають дані під час великих транзакцій.

Більш докладно тут про вибір правильного: Вибір рівнів ізоляції на основі версій .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.