Властивості транзакцій. Способи завершення транзакцій
Існують різні моделі транзакцій, які можуть бути класифіковані на основі різних властивостей, що включають структуру транзакції, паралельність всередині транзакції, тривалість і т.д.
В даний час виділяють наступні типи транзакцій: плоскі або класичні транзакції, ланцюгові транзакції і вкладені транзакції.
Плоскі транзакції характеризуються класичними властивостями: атомарности, узгодженості, ізольованості і довговічності.
· Властивість атомарности виражається в тому, що транзакція повинна бути виконана в цілому або не виконано зовсім.
· Властивість узгодженості гарантує, що в міру виконання транзакції дані переходять з одного узгодженого стану в інше узгоджене стан - транзакція не руйнує взаємну узгодженість даних.
· Властивість ізольованості означає, що конкуруючі за доступ до БД транзакції фізично обробляються послідовно, ізольовано один від одного, але для користувачів це виглядає так, як ніби вони виконуються паралельно.
· Властивість довговічності означають, що якщо транзакція завершена успішно, то ті зміни даних, які були нею зроблені, не можуть бути втрачені ні за яких обставин, навіть в разі подальших помилок.
Можливі 2 варіанти завершення транзакції:
· Якщо всі оператори виконані успішно та в процесі транзакції не відбулося ніяких збоїв програмного чи апаратного забезпечення, транзакція фіксується. (Фіксація - це запис на диск змін в БД, які були зроблені в процесі виконання транзакції). До тих пір, поки транзакція не зафіксована, ці зміни можуть бути анульовані і база даних може бути повернута в той стан, в якому вона була на момент початку транзакції. Фіксація транзакції означає, що всі результати виконання транзакції стають постійними. Вони стануть видимі іншим транзакцій тільки після того, як поточна транзакція буде зафіксована.
· Якщо в процесі виконання транзакції стався збій, БД повинна бути повернута в початковий стан. Відкат транзакції - це дію, що забезпечує анулювання всіх змін даних, які були зроблені операторами SQL в тілі поточної незавершеною транзакції.
У стандарті ANSI / ISO визначено оператори СOMMIT і ROLLBACK, в стандарті початок транзакції неявно задається першим оператором модифікації даних; Оператор COMMIT означає успішне завершення транзакції, результати транзакції фіксуються у зовнішній пам'яті; при завершенні транзакції оператором ROLLBACK результати транзакції скасовуються. Успішне завершення програми, в якій була ініційована транзакція, означає успішне завершення транзакції (як якщо б був використаний оператор COMMIT), неуспішне завершення - перериває транзакцію (начебто використали оператор ROLLBACK). У цій моделі кожен оператор, що змінює стан даних, розглядається як транзакція. Така модель була реалізована в перших версіях комерційних СУБД. Надалі в СУБД SYBASE була реалізована розширена модель транзакцій.
У розширеній моделі транзакцій (наприклад, в СУБД SQL SERVER) передбачено низку додаткових операцій:
· Оператор BEGIN TRANSACTION повідомляє про початок транзакції;
· Оператор COMMIT TRANSACTION повідомляє про успішне завершення транзакції. Цей оператор, також як і COMMIT в моделі стандарту ANSI / ISO, фіксує всі зміни, які проводилися в БД в процесі виконання транзакції;
· Оператор SAVE TRANSACTION створює усередині транзакції точку збереження, яка відповідає проміжному станом БД, збереженому на момент виконання цього оператора. В операторі SAVE TRANSACTION може стояти ім'я точки збереження, тому в ході виконання транзакції може бути запомнено кілька точок збереження відповідних декільком проміжним станам;
· Оператор ROLLBACK має 2 модифікації. Якщо він використовується без додаткового параметра, то він інтерпретується як оператор відкату всієї транзакції, якщо ж він має параметр ROLLBACK n. то він інтерпретується як оператор часткового відкату транзакції в точку збереження n.
Точки збереження доцільно використовувати в довгих і складних транзакціях, щоб забезпечити можливість скасування змін, виконаних певними операторами.
У більшості випадків можна встановити параметр, званий AUTOCOMMIT. який буде автоматично запам'ятовувати всі виконувані команди, причому дії, які призвели до помилки, завжди будуть автоматично скасовані. Зазвичай цей режим встановлюється за допомогою команди типу: