Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.Б.Д / лекции / 16БД.doc
Скачиваний:
38
Добавлен:
30.05.2020
Размер:
413.7 Кб
Скачать

3 Блокування

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Соседние файлы в папке лекции