Іноді єдина, з точки зору користувача, операція може вимагати декількох операцій над базою даних. Більше того, між цими операціями може навіть порушуватися цілісність бази даних. Наприклад, в ній можуть тимчасово міститися деякі записи постачань, для яких не має відповідних записів продуктів, що поставляються. Протиріччя зникнуть тільки після виконання всіх поновлень, тобто виконання логічної одиниці роботи - повної заміни номера продукту в базі даних.
(Транзакція - логічна одиниця роботи)
Транзакція являє собою послідовність операцій над базою даних, яка повинна бути виконана або повністю, або зовсім не виконана. Ядро бази даних гарантує, що, або операції, які виконуються в рамках транзакції, будуть цілком і повністю зафіксовані на диску, або буде відновлений стан бази даних, в якому вона перебувала до початку транзакції. Транзакція є не тільки засобом захисту від непередбачених аварійних відмов; вона також забезпечує програмі можливість безпечного виходу з ситуації, коли ця програма виявляє логічну помилку.
Більшість СУБД дозволяють любому числу транзакцій водночас здійснювати доступ до однієї і тієї ж бази даних і в них існують ті або інші механізми керування паралельними процесами, які запобігають небажаному впливу одних транзакцій на інші. По суті це механізм блокування, головна ідея якого достатньо проста. Якщо транзакції потрібні гарантії, що деякий об'єкт (база даних, таблиця, рядок або поле), в якому вона зацікавлена, не буде змінений яким-небуть непередбаченим способом на протязі необхідного проміжку часу, вона встановлює блокування цього об'єкту. Результат блокування полягає в тому, щоб ізолювати цей об'єкт від інших транзакцій і запобігти його зміні засобами цих транзакцій. Для першої транзакції, таким чином, є можливість виконувати передбачену в ній обробку, маючи певні знання про те, що об'єкт в запиті буде залишатися в стабільному стані до тих пір, доки дана транзакція буде цього бажати.
Існує декілька рівнів ізоляції (Dirty Read, Committed Read, Repeatable Read). Вони відрізняються правилами використання блокування програмою і діють таким чином:
* Рівень Dirty Read ("чорнове" читання або читання з робочих буферів) дозволяє транзакції читати всі поточні зміни, які проводяться іншими транзакціями, в тому числі не зафіксовані в базі даних.
* Рівень Committed Read (підтверджене читання) дозволяє транзакції читати тільки зафіксовані в базі даних зміни інших транзакцій.
* Рівень Repeatable Read (читання, що повторюється) не дозволяє транзакції після початку її виконання і до кінця читати зміни, зроблені іншими транзакціями, навіть якщо ці зміни зафіксовані в базі даних. Наступна транзакція додатку буде читати оновлені записи
В більшості СУБД створюється механізм обробки транзакцій, при ініціюванні якого всі зміни даних будуть розглядаються як попередні до тих пор, поки користувач (інколи система) не видасть команди:
COMMIT (фіксувати), що перетворює всі попередні поновлення в остаточні.
ROLLBACK (відкат), що анулює всі попередні поновлення.
Визначення початку транзакції (стандарт SQL)
Синтаксис оператора для початку транзакції включає параметри для встановлення рівня ізоляцїї транзакції :
SET TRANSACTION [READ WRITE | READ ONLY] [WAIT | NO WAIT]
дозвіл для транзакції на виконання операцій читання та запису
READ ONLY
-
дозвіл для транзакції на виконання тільки операцій читання.
WAIT
-
визначає, що в разі доступу до запису іншою транзакцією необхідно її чекати
NO WAIT
-
визначає, що в разі конфлікту блокування обробка запиту припиняється та повертається повідомлення про помилку
ISOLATION LEVEL
-
визначає рівень ізоляції транзакції, в умовах коли до таблиць цієї ж бази звертаються інші транзакції. Можливі значення:
SNAPSHOT TABLE STABILITY - зміни зроблені іншими транзакціями в таблиці недоступні для даної транзакції (блокування таблиці); READ COMMITED - показувати змінену версію рядка таблиці та дозволити неконфліктні зміни, при цьому:
NO RECORD_VERSION - читається останній непідтверджений варіант запису, але якщо включено очікування (WAIT) транзакція буде чекати завершення іншої транзакції і повторить читання.
RECORD_VERSION - читається остання підтверджена версія запису.
Значення за замовчанням: SNAPSHOT.
RESERVING <reserving_clause>
-
транзакція блокує доступ конкуруючих транзакцій до вказаних таблиць
Завершення транзакції може проводитися або з підтвердженням змін в базі даних проведених транзакцією (підтвердження транзакції) або з відмовою від змін (відкат транзакції).