Материал: 15БД

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

16. Лекція: Транзакції і блокування:

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

План

1 Введення в транзакції

2 ACID-властивості транзакцій

3 Блокування

4 Управління транзакціями

5 Управління транзакціями в середовищі MS SQL Server

5.1 Визначення транзакцій

5.2 Явні транзакції

5.3 Вкладені транзакції

6 Управління блокуваннями

7 "Мертві" блокування

8 Рівні ізоляції SQL Server

1 Введення в транзакції

Концепція транзакцій – невід'ємна частина будь-якої клієнт-серверної бази даних.

Під транзакцією розуміється неподільна з погляду БД послідовність операторів маніпулювання даними (читання, видалення, вставки, модифікації), що приводить до одного з двох можливих результатів: або послідовність виконується, якщо всі оператори правильні, або вся транзакція відкатується, якщо хоча б один оператор не може бути успішно виконаний. Обробка транзакцій гарантує цілісність інформації в базі даних. Таким чином, транзакція переводить базу даних з одного цілісного стану в інший.

Підтримка механізму транзакцій – показник рівня розвиненості СУБД. Коректна підтримка транзакцій одночасно є основою забезпечення цілісності БД. Транзакції також складають основу ізольованості в розрахованих на багато користувачів системах, де з однією БД паралельно можуть працювати декілька користувачів або прикладних програм. Одна з основних задач СУБД – забезпечення ізольованості, тобто створення такого режиму функціонування, при якому кожному користувачу здавалося б, що БД доступна тільки йому. Таку задачу СУБД прийнято називати паралелізмом транзакцій.

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

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

2 Acid-властивості транзакцій

Характеристики транзакцій описуються в термінах ACID (Atomicity, Consistency, Isolation, Durability – неподільність, узгодженість, ізольованість, стійкість ).

Транзакція неподільна в тому значенні, що є єдиним цілим. Всі її компоненти або мають місце, або ні. Не буває часткової транзакції. Якщо може бути виконана лише частина транзакції, вона відхиляється.

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

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

Транзакція стійка. Після свого завершення вона зберігається в системі, яку ніщо не може повернути в початковий (до початку транзакції ) стан, тобто відбувається фіксація транзакції, що означає, що її дія постійна навіть при збої системи. При цьому мається на увазі якась форма зберігання інформації в постійній пам'яті як частина транзакції .

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

3 Блокування

Підвищення ефективності роботи при використовуванні невеликих транзакцій зв'язано з тим, що при виконанні транзакції сервер накладає на дані блокування.

Блокуванням називається тимчасове обмеження на виконання деяких операцій обробки даних. Блокування може бути накладено як на окремий рядок таблиці, так і на всю базу даних. Управлінням блокуваннями на сервері займається менеджер блокувань, контролюючий їх вживання і дозвіл конфліктів. Транзакції і блокування тісно пов'язані один з одним. Транзакції накладають блокування на дані, щоб забезпечити виконання вимог ACID. Без використовування блокувань декілька транзакцій могли б змінювати одні і ті ж дані.

Блокування є методом управління паралельними процесами, при якому об'єкт БД не може бути модифікований без відома транзакції, тобто відбувається блокування доступу до об'єкту з боку інших транзакцій, чим виключається непередбачувана зміна об'єкту. Розрізняють два види блокування:

  • блокування запису – транзакція блокує рядки в таблицях таким чином, що запит іншої транзакції до цих рядків буде відмінний ;

  • блокування читання – транзакція блокує рядки так, що запит з боку іншої транзакції на блокування запису цих рядків буде знехтуваний, а на блокування читання – прийнятий.

В СУБД використовують протокол доступу до даних, що дозволяє уникнути проблеми паралелізму. Його суть полягає в наступному:

  • транзакція, результатом дії якої на рядок даних в таблиці є її витягання, зобов'язана накласти блокування читання на цей рядок;

  • транзакція, призначена для модифікації рядка даних, накладає на неї блокування запису;

  • якщо запрошуване блокування на рядок відкидається через вже наявне блокування, то транзакція переводиться в режим очікування до тих пір, поки блокування не буде знято;

  • блокування запису зберігається аж до кінця виконання транзакції.

Рішення проблеми паралельної обробки БД полягає в тому, що рядки таблиць блокуються, а подальші транзакції, що модифікують ці рядки, відкидаються і переводяться в режим очікування. У зв'язку з властивістю збереження цілісності БД транзакції є відповідними одиницями ізольованості користувачів. Дійсно, якщо кожний сеанс взаємодії з базою даних реалізується транзакцією, то користувач починає з того, що звертається до злагодженого стану бази даних – стану, в якому вона могла б знаходитися, навіть якщо б користувач працював з нею поодинці.

Якщо в системі управління базами даних не реалізовані механізми блокування, то при одночасному читанні і зміні одних і тих же даних декількома користувачами можуть виникнути наступні проблеми одночасного доступу:

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

  • проблема "брудного" читання можлива в тому випадку, якщо користувач виконує складні операції обробки даних, що вимагають множинної зміни даних перед тим, як вони знайдуть логічно вірний стан. Якщо під час зміни даних інший користувач прочитуватиме їх, то може виявитися, що він одержить логічно невірну інформацію. Для виключення подібних проблем необхідно проводити прочитування даних після закінчення всіх змін;

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

  • проблема читання фантомів з'являється після того, як одна транзакція вибирає дані з таблиці, а інша вставляє або видаляє рядки до завершення першої. Вибрані з таблиці значення будуть некоректні.

Для вирішення перерахованих проблем в спеціально розробленому стандарті визначено чотири рівні блокування. Рівень ізоляції транзакції визначає, чи можуть інші (конкуруючі) транзакції вносити зміни в дані, змінені поточною транзакцією, а також чи може поточна транзакція бачити зміни, проведені конкуруючими транзакціями, і навпаки. Кожний подальший рівень підтримує вимоги попереднього і накладає додаткові обмеження:

  • рівень 0 – заборона "забруднення" даних. Цей рівень вимагає, щоб змінювати дані могла тільки одна транзакція ; якщо іншій транзакції необхідно змінити ті ж дані, вона повинна чекати завершення першої транзакції ;

  • рівень 1 – заборона "брудного" читання. Якщо транзакція почала зміну даних, то ніяка інша транзакція не зможе прочитати їх до завершення першої;

  • рівень 2 – заборона неповторюваного читання. Якщо транзакція прочитує дані, то ніяка інша транзакція не зможе їх змінити. Таким чином, при повторному читанні вони знаходитимуться в первинному стані;

  • рівень 3 – заборона фантомів. Якщо транзакція звертається до даних, то ніяка інша транзакція не зможе додати нові або видалити ті, що мають рядки, які можуть бути лічені при виконанні транзакції. Реалізація цього рівня блокування виконується шляхом використовування блокувань діапазону ключів. Подібне блокування накладається не на конкретні рядки таблиці, а на рядки, що задовольняють певній логічній умові.

4 Управління транзакціями

Під управлінням транзакціями розуміється здатність управляти різними операціями над даними, які виконуються усередині реляційної СУБД. Перш за все, мається на увазі виконання операторів INSERT, UPDATE і DELETE. Наприклад, після створення таблиці (виконання оператора CREATE TABLE ) не потрібно фіксувати результат: створення таблиці фіксується в базі даних автоматично. Так само за допомогою відміни транзакції не вдасться відновити тільки що видалену оператором DROP TABLE таблицю.

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

Існують три команди, які використовуються для управління транзакціями:

  • COMMIT – для збереження змін ;

  • ROLLBACK – для відміни змін ;

  • SAVEPOINT – для установки особливих точок повернення.

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

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

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

Команда SAVEPOINT (точка збереження) призначена для установки в транзакції особливих крапок, куди надалі може бути проведений відкіт (при цьому відкоту всієї транзакції не відбувається). Команда має наступний вигляд:

SAVEPOINT ім’я_точки_збереження

Вона служить виключно для створення точок збереження серед операторів, призначених для зміни даних. Ім'я точки збереження в пов'язаній з нею групі транзакцій повинне бути унікальним.

Для відміни дії групи транзакцій, обмежених точками збереження, використовується команда ROLLBACK з наступним синтаксисом:

ROLLBACK TO ім’я_точки_збереження

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

5 Управління транзакціями в середовищі ms sql Server

5.1 Визначення транзакцій

SQL Server пропонує безліч засобів управління поведінкою транзакцій. Користувачі в основному повинні указувати тільки початок і кінець транзакції, використовуючи команди SQL або API (прикладного інтерфейсу програмування). Транзакція визначається на рівні з'єднання з базою даних і при закритті з'єднання автоматично закривається. Якщо користувач спробує встановити з'єднання знову і продовжити виконання транзакції, то це йому не вдасться. Коли транзакція починається, всі команди, виконані в з'єднанні, вважаються тілом однієї транзакції, поки не буде досягнутий її кінець.

SQL Server підтримує три види визначення транзакцій:

  • явне ;

  • автоматичне;

  • мається на увазі.

За умовчанням SQL Server працює в режимі автоматичного початку транзакцій, коли кожна команда розглядається як окрема транзакція. Якщо команда виконана успішно, то її зміни фіксуються. Якщо при виконанні команди відбулася помилка, то зроблені зміни відміняються і система повертається в первинний стан.

Коли користувачу знадобиться створити транзакцію, що включає декілька команд, він повинен явно вказати транзакцію.

Сервер працює тільки в одному з двох режимів визначення транзакцій: автоматичному або мається на увазі. Він не може знаходитися в режимі виключно явного визначення транзакцій. Цей режим працює поверх двох інших.

Источник: https://studfile.net/preview/14501246/