Главная » Файлы » Мои файлы |
Серіалізація транзакцій. Розв'язання проблем транзакцій за допомогою блокування (захоплення)
[ Скачать с сервера (117.5 Kb) ] | 17.02.2018, 23:22 |
Серіалізація транзакцій. Розв'язання проблем транзакцій за допомогою блокування (захоплення) Як вже говорилося, є два способи розв'язати конкуренцію між надходячими в довільні моменти транзакціями: • "Пригальмовувати" деякі з що надходять транзакцій настільки, наскільки це необхідно для забезпечення правильності суміші транзакцій у кожен момент часу (тобто забезпечити, щоб конкуруючі транзакції виконувалися в різний час). • Надати конкуруючим транзакціям "різні" екземпляри даних (тобто забезпечити, щоб конкуруючі транзакції працювали з різними версіями даними). Перший метод - "пригальмовування" транзакцій - реалізується шляхом використанням блокувань різних видів чи методу часових міток. Другий метод - надання різних версій даних - реалізується шляхом використанням даних з журналу транзакцій. 1.1. Блокування. Синхронізаційні захоплення Основна ідея блокувань, які ще називають синхронізаційними захопленнями, полягає в тому, що якщо для виконання певної транзакції необхідно, щоб деякий об'єкт не змінювався без відома цієї транзакції, то цей об'єкт повинен бути заблокований, тобто доступ до цього об'єкта з боку інших транзакцій обмежується на час виконання транзакції, що викликала блокування. Реалізація блокувань заснована на дотриманні двухфазного протоколу синхронізаційних захоплень об'єктів БД. Загалом протокол полягає в тому, що перед виконанням будь-якої операції в транзакції T над об'єктом бази даних r від імені транзакції T заппрошується синхронизаційне захоплення об'єкта r у відповідному режимі (у залежності від виду операції). Розрізняють два типи блокувань (захоплень): • Монопольні блокування (X-блокування, X-locks - eXclusive locks) - блокування без взаємного доступу (блокування запису). • Поділювані блокування (S-блокування, S-locks - Shared locks) - блокування з взаємним доступом (блокування читання). Якщо транзакція A блокує об'єкт за допомогою X-блокування, то всякий доступ до цього об'єкта з боку інших транзакцій відхиляється. Якщо транзакція A блокує об'єкт за допомогою S-блокування, то • запити з боку інших транзакцій на X-блокування цього об'єкта будуть відкинуті, • запити з боку інших транзакцій на S-блокування цього об'єкта будуть прийняті. Транзакція, що запросила доступ до об'єкта, уже захопленого іншою транзакцією в несумісному режимі, зупиняється доти, доки захоплення цього об'єкта не буде зняте. Правила взаємного доступу до заблокованих об'єктів можна представити у вигляді наступної матриці сумісності блокувань. Якщо транзакція A наклала блокування на деякий об'єкт, а транзакція B після цього намагається накласти блокування на цей же об'єкт, то успішність блокування транзакцією B об'єкта описується таблицею: Транзакція B намагається накласти блокування: Транзакція A наклала блокування: S-блокування X-блокування S-блокування Так НІ (Конфлікт R-W) X-блокування НІ (Конфлікт W-R) НІ (Конфлікт W-W) Таблиця 1 Матриця сумісності S- і X-блокувань Три випадки, коли транзакція B не може блокувати об'єкт, відповідають трьом видам конфліктів між транзакціями. Доступ до об'єктів бази даних на читання і запис повинен здійснюватися у відповідності з наступним протоколом доступу до даних: • Перш ніж прочитати об'єкт, транзакція повинна накласти на цей об'єкт S-блокування. • Перш ніж обновити об'єкт, транзакція повинна накласти на цей об'єкт X-блокування. Якщо транзакція вже заблокувала об'єкт S-блокуванням (для читання), то перед оновленням об'єкта S-блокування повинне бути замінене X-блокуванням. • Якщо блокування об'єкта транзакцією B відхиляється тому, що об'єкт уже заблокований транзакцією A, то транзакція B переходить у стан чекання. Транзакція B буде знаходитися в стані чекання доти, поки транзакція A не зніме блокування об'єкта. • X-блокування, накладені транзакцією A, зберігаються до кінця транзакції A. Доведено, що серіалізованість транзакцій (чи, інакше, їхня ізоляція) забезпечується при використанні двофазного протоколу блокувань (2LP - Two-Phase Locks), відповідно до якого всі блокування, зроблені транзакцією, знімаються тільки при її завершенні. Тобто виконання транзакції розбивається на дві фази: (1) - нагромадження блокувань, (2) (2) - звільнення блокувань у результаті фіксації чи відкату. На жаль, застосування механізму блокування приводить до уповільнення обробки транзакцій, оскільки система змушена очікувати, поки звільняться дані, захоплені конкуруючої транзакцією. Вирішити цю проблему можна за рахунок зменшення фрагментів даних, захоплюваних транзакцією. У залежності від захоплюваних об'єктів розрізняють кілька рівнів блокування: • блокується вся база даних - очевидно, цей варіант непридатний, оскільки зводить багатокористувацький режим роботи до однокористувальницького • блокуються окремі таблиці • блокуються сторінки (сторінка - фрагмент таблиці розміром звичайно 2-4 Кб, одиниця виділення пам'яті для обробки даних системою) • блокуються записи • блокуються окремі поля Сучасні СУБД, як правило, можуть здійснювати блокування на рівні записів чи сторінок. Мова SQL також надає спосіб непрямого управління швидкістю виконання транзакцій за допомогою вказування рівня ізоляції транзакції. Під рівнем ізоляції транзакції розуміється можливість виникнення однієї з описаних вище помилкових ситуацій. У стандарті SQL визначені 4 рівні ізоляції: Рівень ізоляції Брудне читання Розмите читання Фантом Незафіксоване читання (READ UNCOMMITTED) можливо можливо можливо Зафіксоване читання (READ COMMITED) неможливо можливо можливо Повторюване читання (REPEATABLE READ) неможливо неможливо можливо Серіалізованість (SERIALIZABLE) неможливо неможливо неможливо Для визначення характеристик транзакції використовується оператор SET TRANSACTION <режим_доступу>, <рівень_ізоляції> Список рівнів ізоляції приведений у таблиці. Режим доступу за замовчуванням використовується READ WRITE (читання запис), якщо заданий рівень ізоляції READ UNCOMMITED, те режим доступу повинен бути READ ONLY (тільки читання). 1.2. Навмисні блокування (гранульовані синхронізаційні захоплення) Як видно з аналізу поводження транзакцій, при використанні протоколу доступу до даних не вирішується проблема фантомів. Це відбувається тому, що були розглянуті тільки блокування на рівні рядків. Можна розглядати блокування й інших об'єктів бази даних: • Блокування самої бази даних. • Блокування файлів бази даних. • Блокування таблиць бази даних. • Блокування сторінок (Одиниць обміну з диском, звичайно 2-16 Кб. На одній сторінці міститься кілька рядків однієї чи кількох таблиць). • Блокування окремих рядків таблиць. • Блокування окремих полів. Крім того, можна блокувати індекси, заголовки таблиць чи інші об'єкти. Чим крупніше об'єкт блокування, тим менше можливостей для рівнобіжної роботи. Перевагою блокувань великих об'єктів є зменшення накладних витрат системи і вирішення проблем, не розв'язуваних з використанням блокувань менш великих об'єктів. Наприклад, використання монопольного блокування на рівні таблиці, мабуть, вирішує проблему фантомів. Сучасні СУБД, як правило, підтримують мінімальний рівень блокування на рівні рядків чи сторінок. (У старих версіях настільної СУБД Paradox підтримувалося блокування на рівні окремих полів.). При использовании блокировок объектов разной величины возникает проблема обнаружения уже наложенных блокировок. Якщо транзакція A намагається заблокувати таблицю, то необхідно мати інформацію, чи не накладені вже блокування на рівні рядків цієї таблиці, несумісні з блокуванням таблиці. Для вирішення цієї проблеми використовується протокол навмисних блокувань, що є розширенням протоколу доступу до даних. Навмисні блокування деколи ще називають гранульованими захопленнями. Суть цього протоколу в тому, що перед тим, як накласти блокування на об'єкт (наприклад, на рядок таблиці), необхідно накласти спеціальне навмисне блокування (блокування наміру) на об'єкти, до складу яких входить блокований об'єкт - на таблицю, що містить рядок, на файл, що містить таблицю, на базу даних, що містить файл. Тоді наявність навмисного блокування таблиці буде свідчити про наявність блокування рядків таблиці і для іншої транзакції, що намагається блокувати цілу таблицю не потрібно перевіряти наявність блокувань окремих рядків. Більш точно, уводяться наступні нові типи блокувань: • Навмисне блокування з можливістю взаємного доступу (IS-блокування - Intent Shared lock). Накладається на деякий складений об'єкт T і означає намір блокувати певний вхідний у T об'єкт у режимі S-блокування. Наприклад, при намірі читати рядки з таблиці T, ця таблиця повинна бути заблокована в режимі IS (до цього в такому ж режимі повинен бути заблокований файл). | |
Просмотров: 628 | Загрузок: 18 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |