
- •Поняття транзакції та блокування.
- •Правила acid. Атомарність, узгодженість, ізольованість, стійкість.
- •Типи неузгодженості даних при відсутності блокувань
- •Рівні блокувань за стандартом ansi (чотири).
- •Типи транзакцій. Явні, неявні та автоматичні транзакції.
- •Типи транзакцій. Розподілені транзакції.
- •Початок, завершення та відкат транзакції. Точка зберігання. (23)
- •Керування блокуваннями. Менеджер блокувань. Час очікування.
- •Рівні блокувань
- •Рівні ізоляції.
- •Типи блокувань
- •Мертві блокування.
- •Збережені процедури. Доцільність використання. Типи збережених процедур.
- •Етапи розробки збережених процедур.
- •Синтаксис створення, зміни, видалення та виклику збережених процедур
- •Використання параметрів у збережених процедурах.
- •Тригери. Застосування тригерів.
- •Функції columnsupdated() та update () у тілі тригера.
- •Створення, зміна та видалення тригеру.
- •Керування транзакціями в тілі тригера. Фіксація та відкат змін користувача.(7)
Типи блокувань
READ - блокує таблицю для читання. Всі клієнти можуть отримувати даніодночасно, але ніхто не може їх змінювати, навіть той клієнт, який встановивблокування. WRITE - блокує таблицю для запису. Тільки клієнт встановив блокування може отримувати і змінювати дані. READ LOCAL - блокує таблицю для читання, але дозволяє здійснювати вставкуданих (INSERT). Застосовується тільки до таблиць MyISAM, які не мають дірок, утворених в результаті зміни або видалення рядків. У цьому випадку, додавання нових даних проводиться в кінець таблиці. Якщо таблиця має дірки, то їх можна усунути, використовуючи оператор OPTIMIZE TABLE. LOW_PRIORITY WRITE - блокує таблицю для запису, але під час очікування блокування пропускає тих клієнтів, які стоять у черзі на отримання блокуваннятипу READ. Під час очікування блокування, нові запити на блокування типуREAD також пропускаються вперед, що може потенційно привести до того, щозапис не буде зроблена ніколи (якщо завжди є клієнти в черзі на читання).
Мертві блокування.
"Мертві", або тупикові, блокування характерні для багатокористувацьких систем. "Мертве" блокування виникає, коли дві транзакції блокують два блоки даних і для завершення будь-якої з них потрібен доступ до даних, заблокованим раніше іншою транзакцією. Для завершення кожної транзакції необхідно дочекатися, поки блокована іншою транзакцією частина даних буде розблокована. Але це неможливо, тому що друга транзакція очікує розблокування ресурсів, використовуваних першої. Без застосування спеціальних механізмів виявлення і зняття "мертвих" блокувань нормальна робота транзакцій буде порушена. Якщо в системі встановлений нескінченний період очікування завершення транзакції (а це задано за замовчуванням), то при виникненні "мертвої" блокування для двох транзакцій цілком можливо, що, чекаючи звільнення заблокованих ресурсів, в глухому куті опиняться і нові транзакції. Щоб уникнути подібних проблем, в середовищі MS SQL Server реалізований спеціальний механізм вирішення конфліктів тупикового блокування. Для цих цілей сервер знімає одну з блокувань, що викликали конфлікт, і відкатує ініціалізувати її транзакцію. При виборі блокування, якою необхідно пожертвувати, сервер виходить з міркувань мінімальної вартості. Повністю уникнути виникнення "мертвих" блокувань не можна. Хоча сервер і має ефективні механізми зняття таких блокувань, все ж при написанні програм слід враховувати ймовірність їх виникнення та вживати всіх можливих заходів для попередження цього. "Мертві" блокування можуть істотно знизити продуктивність, оскільки системі потрібно досить багато часу для їх виявлення, відкоту транзакції і повторного її виконання. Для мінімізації можливості утворення "мертвих" блокувань при розробці коду транзакції слід дотримуватися наступних правил: виконувати дії з обробки даних в постійному порядку, щоб не створювати умови для захоплення одних і тих же даних; уникати взаємодії з користувачем в тілі транзакції; мінімізувати тривалість транзакції і виконувати її по можливості в одному пакеті; застосовувати якомога нижчий рівень ізоляції.