Ноу Інти, лекція, транзакції і блокування
Анотація: Наводиться визначення транзакції і її властивостей; представлені явні, неявні, автоматичні і вкладені транзакції. Описуються засоби обробки і управління транзакціями. Розглядається механізм збереження і відкату транзакцій. Вводиться поняття паралельності в роботі бази даних і методи управління паралельною з використанням блокувань. Наводиться опис рівнів блокувань і рівнів ізоляції сервера. Виділяються основні та спеціальні типи блокувань.
Введення в транзакції
Концепція транзакцій - невід'ємна частина будь-який клієнт-серверної бази даних.
Під транзакцією розуміється неподільна з точки зору впливу на БД послідовність операторів маніпулювання даними (читання, видалення, вставки, модифікації), що приводить до одного з двох можливих результатів: або послідовність виконується, якщо всі оператори правильні, або вся транзакція відкочується, якщо хоча б один оператор не може бути успішно виконаний. Обробка транзакцій гарантує цілісність інформації в базі даних. Таким чином, транзакція переводить базу даних з одного цілісного стану в інший.
Підтримка механізму транзакцій - показник рівня розвиненості СУБД. Коректне підтримку транзакцій одночасно є основою забезпечення цілісності БД. Транзакції також складають основу ізольованості в багатокористувацьких системах, де з одного БД паралельно можуть працювати кілька користувачів або прикладних програм. Одна з основних завдань СУБД - забезпечення ізольованості. тобто створення такого режиму функціонування, при якому кожному користувачеві здавалося б, що БД доступна тільки йому. Таке завдання СУБД прийнято називати паралелізмом транзакцій.
Більшість виконуваних дій проводиться в тілі транзакцій. За замовчуванням кожна команда виконується як самостійна транзакція. При необхідності користувач може явно вказати її початок і кінець. щоб мати можливість включити в неї кілька команд.
При виконанні транзакції система управління базами даних повинна дотримуватися певних правил обробки набору команд, що входять в транзакцію. Зокрема, розроблено чотири правила, відомі як вимоги ACID. вони гарантують правильність і надійність роботи системи.
ACID-властивості транзакцій
Характеристики транзакцій описуються в термінах ACID (Atomicity, Consistency, Isolation. Durability - неподільність. Узгодженість. Ізольованість. Стійкість).
- Транзакція неподільна в тому сенсі, що являє собою єдине ціле. Всі її компоненти або мають місце, або ні. Не буває часткової транзакції. Якщо може бути виконана лише частина транзакції. вона відхиляється.
- Транзакція є узгодженою. бо не порушує бізнес-логіку і відносини між елементами даних. Це властивість дуже важливо при розробці клієнт-серверних систем, оскільки в сховище даних надходить велика кількість транзакцій від різних систем і об'єктів. Якщо хоча б одна з них порушить цілісність даних, то всі інші можуть видати невірні результати.
- Транзакція завжди ізольована. оскільки її результати самодостатні. Вони не залежать від попередніх або наступних транзакцій - це властивість називається Серіалізуемое і означає, що транзакції в послідовності незалежні.
- Транзакція стійка. Після свого завершення вона зберігається в системі, яку ніщо не може повернути у вихідне (до початку транзакції) стан, тобто відбувається фіксація транзакції. що означає, що її дія постійно навіть при збої системи. При цьому мається на увазі якась форма зберігання інформації в постійній пам'яті як частина транзакції.
Зазначені вище правила виконує сервер. Програміст лише вибирає потрібний рівень ізоляції. дбає про дотримання логічної цілісності даних і бізнес-правил. На нього покладаються обов'язки щодо створення ефективних і логічно вірних алгоритмів обробки даних. Він вирішує, які команди повинні виконуватися як одна транзакція. а які можуть бути розбиті на декілька послідовно виконуваних транзакцій. Слід по можливості використовувати невеликі транзакції. тобто включають якомога менше команд і змінюють мінімум даних. Дотримання цієї вимоги дозволить найбільш ефективним чином забезпечити одночасну роботу з даними безлічі користувачів.
блокування
Підвищення ефективності роботи при використанні невеликих транзакцій пов'язано з тим, що при виконанні транзакції сервер накладає на дані блокування.
Блокуванням називається тимчасове обмеження на виконання деяких операцій обробки даних. Блокування може бути накладена як на окремий рядок таблиці, так і на всю базу даних. Управлінням блокуваннями на сервері займається менеджер блокувань, контролюючий їх застосування і вирішення конфліктів. Транзакції і блокування тісно пов'язані один з одним. Транзакції накладають блокування на дані, щоб забезпечити виконання вимог ACID. Без використання блокувань кілька транзакцій могли б змінювати одні й ті ж дані.
Блокування являє собою метод управління паралельними процесами. при якому об'єкт БД не може бути модифікований без відома транзакції. тобто відбувається блокування доступу до об'єкта з боку інших транзакцій. ніж виключається непередбачуване зміна об'єкта. Розрізняють два види блокування:
- блокування записи - транзакція блокує рядки в таблицях таким чином, що запит іншої транзакції до цих рядків буде скасований;
- блокування читання - транзакція блокує рядки так, що запит з боку іншої транзакції на блокування записи цих рядків буде відкинутий, а на блокування читання - прийнятий.
В СУБД використовують протокол доступу до даних, що дозволяє уникнути проблеми паралелізму. Його суть полягає в наступному:
- транзакція. результатом дії якої на рядок даних в таблиці є її витяг, зобов'язана накласти блокування читання на цей рядок;
- транзакція. призначена для модифікації рядки даних, накладає на неї блокування записи;
- якщо запитувана блокування на рядок відкидається через вже наявної блокування. то транзакція переводиться в режим очікування до тих пір, поки блокування не буде знята;
- блокування записи зберігається аж до кінця виконання транзакції.
Рішення проблеми паралельної обробки БД полягає в тому, що рядки таблиць блокуються, а наступні транзакції. модифікують ці рядки, відкидаються і переводяться в режим очікування. У зв'язку з властивістю збереження цілісності БД транзакції є придатними одиницями ізольованості користувачів. Дійсно, якщо кожен сеанс взаємодії з базою даних реалізується транзакцією. то користувач починає з того, що звертається до узгодженого станом бази даних - станом, в якому вона могла б знаходитися, навіть якби користувач працював з нею в поодинці.
Якщо в системі управління базами даних не реалізовані механізми блокування, то при одночасному читанні і зміні одних і тих же даних кількома користувачами можуть виникнути такі проблеми одночасного доступу:
- проблема останньої зміни виникає, коли кілька користувачів змінюють одну і ту ж рядок, грунтуючись на її початковому значенні; тоді частина даних буде втрачено, тому що кожна наступна транзакція перезапише зміни, зроблені попередньої. Вихід з цієї ситуації полягає в послідовному внесення змін;
- проблема "брудного" читання можлива в тому випадку, якщо користувач виконує складні операції обробки даних, що вимагають множинного зміни даних перед тим, як вони знайдуть логічно вірне стан. Якщо під час зміни даних інший користувач буде зчитувати їх, то може виявитися, що він отримає логічно невірну інформацію. Для виключення подібних проблем необхідно робити зчитування даних після закінчення всіх змін;
- проблема неповторюваного читання є наслідком неодноразового зчитування транзакцією одних і тих же даних. Під час виконання першої транзакції інша може внести в дані зміни, тому при повторному читанні перша транзакція отримає вже інший набір даних, що призводить до порушення їх цілісності або логічної неузгодженості;
- проблема читання фантомів з'являється після того, як одна транзакція вибирає дані з таблиці, а інша вставляє або видаляє рядки до завершення першої. Обрані з таблиці значення будуть некоректними.
Для вирішення перерахованих проблем в спеціально розробленому стандарті визначено чотири рівня блокування. Рівень ізоляції транзакції визначає, чи можуть інші (конкуруючі) транзакції вносити зміни в дані, змінені поточної транзакцією. а також чи може поточна транзакція бачити зміни, вироблені конкуруючими транзакціями. і навпаки. Кожен наступний рівень підтримує вимоги попереднього і накладає додаткові обмеження:
- рівень 0 - заборона "забруднення" даних. Цей рівень вимагає, щоб змінювати дані могла тільки одна транзакція; якщо інший транзакції необхідно змінити ті ж дані, вона повинна очікувати завершення першої транзакції;
- рівень 1 - заборона "брудного" читання. Якщо транзакція початку зміна даних, то ніяка інша транзакція не зможе прочитати їх до завершення першої;
- рівень 2 - заборона неповторюваного читання. Якщо транзакція зчитує дані, то ніяка інша транзакція не зможе їх змінити. Таким чином, при повторному читанні вони будуть перебувати в незмінному стані;
- рівень 3 - заборона фантомів. Якщо транзакція звертається до даних, то ніяка інша транзакція не зможе додати нові або видалити мають рядки, які можуть бути лічені при виконанні транзакції. Реалізація цього рівня блокування виконується шляхом використання блокувань діапазону ключів. Подібна блокування накладається нема на конкретні рядки таблиці, а на рядки, що задовольняють певному логічному умові.