- •1. Серіалізація транзакцій. Розв'язання проблем транзакцій за допомогою блокування
- •1.1. Блокування. Синхронізаційні захоплення
- •1.2. Навмисні блокування (гранульовані синхронізаційні захоплення)
- •1.3. Предикатні блокування (предикатні синхронізаційні захоплення)
- •1.4. Виникнення і руйнування тупиків
- •2. Метод часових міток
- •3. Механізм виділення версій даних
- •5.1. Рівні ізоляції
- •4. Теорема Есварана про серіалізованість
- •5. Реалізація ізольованості транзакцій засобами sql
- •5.2. Синтаксис операторів sql, що визначають рівні ізоляції
5.2. Синтаксис операторів sql, що визначають рівні ізоляції
Рівень ізоляції транзакції задається наступним оператором:
SET TRANSACTION {ISOLATION LEVEL
{READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE}
| {READ ONLY | READ WRITE}}.,..
Цей оператор визначає режим виконання наступної транзакції, тобто цей оператор не впливає на зміну режиму тієї транзакції, у якій він подається. Звичайно, виконання оператора SET TRANSACTION виділяється як окрема транзакція:
… (попередня транзакція виконується зі своїм рівнем ізоляції)
COMMIT;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
COMMIT;
… (наступна транзакція виконується з рівнем ізоляції REPEATABLE READ)
Якщо задане речення ISOLATION LEVEL, то за ним повинен іти один з параметрів, що визначають рівень ізоляції.
Крім того, можна задати ознаки READ ONLY чи READ WRITE. Якщо зазначена ознака READ ONLY, то передбачається, що транзакція буде тільки читати дані. При спробі запису для такої транзакції буде сгенерирована помилка. Ознака READ ONLY уведена для того, щоб дати виробникам СУБД можливість зменшувати кількість блокувань шляхом використання інших методів серіалізації (наприклад, метод виділення версій).
Оператор SET TRANSACTION повинен задовольняти наступним умовам:
Якщо речення ISOLATION LEVEL відсутнє, то за замовчуванням приймається рівень SERIALIZABLE.
Якщо задана ознака READ WRITE, то параметр ISOLATION LEVEL не може приймати значення READ UNCOMMITTED.
Якщо параметр ISOLATION LEVEL визначений як READ UNCOMMITTED, то транзакція стає за замовчуванням READ ONLY. У противному випадку за замовчуваннямтранзакція вважається як READ WRITE.
Висновки
Сучасні багатокористувацькі системи допускають одночасну роботу великого числа користувачів. При цьому якщо не прийняти спеціальних заходів, транзакції будуть заважати один одному. Цей ефект відомий як проблема паралелізму.
Рішення проблем паралелізму полягає в знаходженні такої стратегії запуску транзакцій, щоб забезпечити серіалізованість графіка запуску і не занадто зменшити ступінь паралельності.
Одним з методів забезпечення серіальності графіка запуску є протокол доступу до даних за допомогою блокувань. У найпростішому випадку розрізняють S-блокування(поділювані) і X-блокування (монопольні), для яких прописано протокол доступу.
Якщо всі транзакції в суміші підкоряються протоколу доступу до даних, то проблеми паралелізму знімаються (майже всі, крім "фантомів"), але з'являються тупики. Стан тупика(dead locks) характеризується тим, що дві чи більше транзакції намагаються заблокувати ті самі об'єкти, і нескінченно довго очікують один одного.
Для руйнування тупиків система періодично чи постійно підтримує графа чекання транзакцій. Наявність циклів у графі чекання свідчить про виникнення тупика. Для руйнування тупика одна з транзакціий (найбільш дешева з погляду системи) вибирається як жертву і відкочується.
Для рішення проблеми "фантомів", а також для зменшення накладних витрат, викликуваних великою кількістю блокувань, застосовуються більш складні методи. Одним з таких методів є навмисні блокування, що блокують об'єкти різної величини - рядка, сторінки, таблиці, файли й ін.
Альтернативним є метод предикатних блокувань
Є також методи серіалізації, що не використовують блокування. Це метод часових міток і механізм виділення версій. Механізм виділення версій зручний тим, що він дозволяє одночасно, і читати, і змінювати ті самі дані різними транзакціями. Це збільшує ступінь паралельності, і загальну продуктивність системи.
Стандарт SQL не передбачає поняття блокувань. Замість цього вводиться поняття рівнів ізоляції. Стандарт передбачає 4 рівні ізоляції:
READ UNCOMMITTED - рівень незавершеного зчитування.
READ COMMITTED - рівень завершеного зчитування.
REPEATABLE READ - рівень повторюваного зчитування.
SERIALIZABLE - рівень здатності до упорядкування.
Транзакції можуть запускатися з різними рівнями ізоляції.
