Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.Б.Д / лекции / 15БД.doc
Скачиваний:
35
Добавлен:
30.05.2020
Размер:
410.11 Кб
Скачать

5.2 Явні транзакції

Явні транзакції вимагають, щоб користувач вказав початок і кінець транзакції, використовуючи наступні команди:

початок транзакції: в журналі транзакцій фіксуються первинні значення змінних даних і момент початку транзакції ;

BEGIN TRAN[SACTION]

[ім’я_транзакції | @ім’я_змінної_транзакції

[WITH MARK [‘опис_транзакції’]]]

кінець транзакції: якщо в тілі транзакції не було помилок, то ця команда наказує серверу зафіксувати всі зміни, зроблені в транзакції, після чого в журналі транзакцій позначається, що зміни зафіксовані і транзакція завершена;

COMMIT [TRAN[SACTION] [ім’я_транзакції | @ім’я_змінної_транзакції]]

створення усередині транзакції точки збереження: СУБД зберігає стан БД в поточній крапці і привласнює збереженому стану ім'я точки збереження;

SAVE TRAN[SACTION]

{ім’я_точки_збереження | @ім’я_змінної_точки_збереження}

переривання транзакції ; коли сервер зустрічає цю команду, відбувається відкіт транзакції, відновлюється первинний стан системи і в журналі транзакцій наголошується, що транзакція була відмінена. Приведена нижче команда відміняє всі зміни, зроблені в БД після оператора BEGIN TRANSACTION або відміняє зміни, зроблені в БД після точки збереження, повертаючи транзакцію до місця, де був виконаний оператор SAVE TRANSACTION.

ROLLBACK [TRAN[SACTION]

[ім’я_транзакції | @ім’я_змінної_транзакції | ім’я_точки_збереження

|@ім’я_змінної_точки_збереження]]

Функція @@TRANCOUNT повертає кількість активних транзакцій.

Функція @@NESTLEVEL повертає рівень вкладеності транзакцій.

BEGIN TRAN

SAVE TRANSACTION point1

Приклад 16.1. Використовування точок збереження

В точці point1 зберігається первинний стан таблиці Товар

DELETE FROM Товар WHERE КодТовара=2

SAVE TRANSACTION point2

В точці point2 зберігається стан таблиці Товар без товарів з кодом 2.

DELETE FROM Товар WHERE КодТовара=3

SAVE TRANSACTION point3

В точці point3 зберігається стан таблиці Товар без товарів з кодом 2 і з кодом 3.

DELETE FROM Товар WHERE КодТовара<>1

ROLLBACK TRANSACTION point3

Відбувається повернення в стан таблиці без товарів з кодами 2 і 3, відміняється останнє видалення.

SELECT * FROM Товар

Оператор SELECT покаже таблицю Товар без товарів з кодами 2 і 3.

ROLLBACK TRANSACTION point1

Відбувається повернення в первинний стан таблиці.

SELECT * FROM Товар

COMMIT

Первинний стан зберігається.

5.3 Вкладені транзакції

Вкладеними називаються транзакції, виконання яких ініціюється з тіла вже активній транзакції .

Для створення вкладеної транзакції користувачу не потрібні які-небудь додаткові команди. Він просто починає нову транзакцію, не закривши попередню. Завершення транзакції верхнього рівня відкладається до завершення вкладених транзакцій. Якщо транзакція самого нижнього ( вкладеного ) рівня завершена невдало і відмінена, то всі транзакції верхнього рівня, включаючи транзакцію першого рівня, будуть відмінені. Крім того, якщо декілька транзакцій нижнього рівня були завершено успішно (але не зафіксовані), проте на середньому рівні (не сама верхня транзакція ) невдало завершилася інша транзакція, то відповідно до вимог ACID відбудеться відкіт всіх транзакцій всіх рівнів, включаючи успішно завершені. Тільки коли всі транзакції на всіх рівнях завершені успішно, відбувається фіксація всіх зроблених змін в результаті успішного завершення транзакції верхнього рівня.

Кожна команда COMMIT TRANSACTION працює тільки з останньою початою транзакцією. При завершенні вкладеної транзакції команда COMMIT застосовується до "найглибшої" вкладеної транзакції. Навіть якщо в команді COMMIT TRANSACTION вказано ім'я транзакції більш високого рівня, буде завершена транзакція, почата останньої.

Якщо команда ROLLBACK TRANSACTION використовується на будь-якому рівні вкладеності без вказівки імені транзакції, то відкатуються всі вкладені транзакції, включаючи транзакцію найвищого (верхнього) рівня. В команді ROLLBACK TRANSACTION дозволяється указувати тільки ім'я самої верхньої транзакції. Імена будь-яких вкладених транзакцій ігноруються, і спроба їх вказівки приведе до помилки. Таким чином, при відкоті транзакції будь-якого рівня вкладеності завжди відбувається відкіт всіх транзакцій. Якщо ж вимагається відкотити лише частину транзакцій, можна використовувати команду SAVE TRANSACTION, за допомогою якої створюється точка збереження.

BEGIN TRAN

INSERT Товар (Назва, залишок)

VALUES ('v',40)

BEGIN TRAN

INSERT Товар (Назва, залишок)

VALUES ('n',50)

BEGIN TRAN

INSERT Товар (Назва, залишок)

VALUES ('m',60)

ROLLBACK TRAN

Приклад 16.2. Вкладені транзакції.

Тут відбувається повернення на початковий стан таблиці, оскільки виконання команди ROLLBACK TRAN без вказівки імені транзакції відкатує всі транзакції.

Блокування в середовищі MS SQL Server

Соседние файлы в папке лекции