Основи транзакцій

Транзакцією називається послідовність завдань, які в сукупності складають логічну одиницю роботи Всі завдання повинні виконуватися або не виконуватися як одне ціле Наприклад, у випадку з операцією інвентарного переміщення товару операції вирахування і складання повинні бути разом записані на диск, або на диск не повинна потрапити ні одна з них

У SQL Server будь-яка операція DML є транзакцією, незалежно від того, має вона оператор BEGIN TRANSACTION чи ні Наприклад, інструкція INSERT, вставляєш 25 рядків, є логічною одиницею роботи Все і кожна з цих 25 рядків повинні бути оновлені Навіть оновлення одного рядка являє собою транзакцію, що включає операції, що працюють з даними та індексами, які або мають бути виконані в цілому, або в цілому не повинні бути виконані

Щоб створити оболонку для безлічі команд однієї транзакцією, потрібно зовсім небагато коду: один компонент, службовець початком транзакції, другий-в кінці Наприкінці транзакції вона може або підтверджуватися після відправки на диск, або відкочуватися якщо в коді зустрілася помилка Наступні три інструкції виглядають простими, проте за ними стоїть досить складний механізм:

■&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp BEGIN TRANSACTION

■&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp COMMIT TRANSACTION

■&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ROLLBACK TRANSACTION

У наступному прикладі продемонстровано типова транзакція Послідовність завдань одягнена в інструкції BEGIN TRANSACTION і COMMIT TRANSACTION За кожною завданням у послідовності слід код обробки помилок, що містить інструкцію ROLLBACK TRANSACTION, що виконує відкат транзакції Якщо перше завдання (віднімання із складських запасів) виконалася успішно, а друге завдання (додавання товару на склад) – немає, то інструкція ROLLBACK TRANSACTION скасовує як друга, так і першу задачу SQL Server відкотить транзакцію навіть у тому випадку, якщо в середині транзакції відбудеться збій Ось як описана система обробляє складське переміщення:

BEGIN TRANSACTION

INSERT InventoryTransaction (InventorylD, Location, Quantity)

VALUES (101, Камера A, -2000)

IF @@Error &lt&gt 0 BEGIN

ROLLBACK TRANSACTION

RAISERROR (Помилка складської транзакції 1, 16, 1)

RETURN

END

INSERT InventoryTransaction (InventorylD, Location, Quantity)

VALUES (101, Камера 12, 2000)

IF @@Error &lt&gt 0

BEGIN

ROLLBACK TRANSACTION

RAISERROR(1 Помилка складської транзакції1, 16, 1)

RETURN

END

COMMIT TRANSACTION

Додаткова Про командах управління потоком операцій (if, begin, end і return) і обра-інформація ботки помилок (@ @ Еггог і raiserror) см в главі 18

Транзакції можуть бути вкладеними, і якщо відкочується вкладена транзакція, то все що очікують її завершення (тобто зовнішні) також відкочуються

Спроба відкотити або підтвердити транзакцію, яка не була відкрита явно, призведе до помилки

У той час як SQL Server вимагає явної ініціації транзакції за допомогою інструкції BEGIN TRANSACTION, такий режим роботи можна змінити так, щоб кожен пакет трактувався як транзакція Наступний код самостійно не поновить стовпець Nickname в базі даних СНА2:

USE СНА2

SET Implicit_Transactions ON

UPDATE CUSTOMER

SET Nickname = Nicky

WHERE CustomerlD = 10

Додавання інструкції COMMIT TRANSACTION в кінець пакету підтвердить транзакцію, і оновлення відбудеться

^ В СУБД Oracle за замовчуванням прийняті неявні транзакції, і розробники Oracle

На замітку при переході на SQL Server повинні змінити свій підхід до транзакцій

У послідовності завдань транзакції можна також оголосити точку збереження і потім виконати відкат до неї Проте особисто мені здається, що це змішує програмний потік управління з обробкою транзакцій Якщо помилка викликає необхідність повторного виконання деякої задачі в транзакції, то буде більш природно організувати стандартну обробку помилок, ніж порушувати природну обробку транзакцій

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*