Але краще обходитися без тригерів, реалізуючи логіку обробки даних через процедури.
Транзакції і конфлікти спільного доступу
На початку параграфа «Збережені процедури» було наведено приклад про «багатоповерхові» оновлення таблиць, які реалізують елементарне (неподільне) з точки зору користувача дію. Послідовність SQL-команд, що виконують цю дію, не може бути перервана на середині - це призведе до некоректного стану даних.
Блок операцій, які або мають бути виконані всі, або не виконана жодна з них, називається транзакцією. Якщо якась операція по ходу транзакції не зможе виконатися або призведе до помилки, слід скасувати всі зміни даних, що відбулися з початку транзакції, і повернути базу в той стан, який вона мала на момент початку цієї транзакції. Скасування змін називаетсяоткатом транзакції (rollback). Якщо всі операції по ходу транзакції пройшли успішно, без помилок, то проізводітсяфіксація транзакції (commit), після чого скасувати зміни вже не можна.
При виконанні транзакцій СУБД дотримується правил обробки команд, сформульованих у вигляді вимог ACID (за початковими літерами вимог):
Atomicity (Атомарність) - виконуються в транзакції зміни будуть або виконані всі, або не будуть виконані зовсім.
Consistency (Узгодженість) - дані в базі до і після виконання транзакції повинні знаходитися в узгодженому стані; в транзакції можлива тимчасова неузгодженість. Під узгодженістю мається на увазі дотримання логічного стану даних. Наприклад, є табліциЗакази (Номер (PK), Дата, СуммаКОплате) іСодержімоеЗаказов (НомерЗаказа (FK), КодТовара (FK), Ціна, Кількість). Вся процедура оформлення нового замовлення є транзакцію: спочатку додається новий рядок вЗакази. при етомСуммаКОплате = 0. Потім набираються товари - додається кілька рядків вСодержімоеЗаказов. Останнім кроком відбувається расчетСуммиКОплате. виходячи з вмісту замовлення. В даному прикладі узгодженість даних - це равенствоСуммиКОплате = Цена * Кількість товарів, що входять в замовлення. Поки додаються товари в замовлення, полеСуммаКОплате = 0 - тимчасова неузгодженість даних.
Isolation (Ізольованість) - зміни, зроблені однією транзакцією, не повинні залежати від змін, зроблених інший транзакцією. Тобто робота кожної транзакції повинна відбуватися так, як ніби ця транзакція працює з базою даних монопольно. Вона повинна бачити тільки ті зміни, яка зробила сама (а фактично в той же самий час інші транзакції можуть оновлювати ці ж дані, але СУБД так «підтасовує» дані в таблицях, що транзакції бачать тільки свої зміни).
Durability (стійкість, довговічність) - після фіксації транзакції (commit) всі зроблені зміни зберігаються в базі, і ніщо не може повернути базу в стан, який вона мала до початку транзакції.
У лабораторній роботі «елементарні» дії користувача слід оформляти у вигляді транзакцій. За тривалістю транзакції умовно можна розділити на короткі (последовательностьSQL-команд, які виконуються один за одним без затримок - близько від мікросекунд до секунд) ідлінние, або бізнес-транзакції 1 (пов'язані з очікуванням дій користувача, як, наприклад, додавання товарів в замовлення - можуть тривати хвилини, години, а можуть зійти нанівець через обрив зв'язку).
Для коротких транзакцій:
в Firebird / Interbase нічого спеціально робити не треба - кожна збережена процедура автоматично є транзакцією.
BEGIN TRAN ІмяТранзакціі
COMMIT TRAN ІмяТранзакціі