Главная » Microsoft SQL Server, Базы данных » Основы транзакций

0

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

В SQL Server любая операция DML является транзакцией, независимо от того, имеет она оператор BEGIN TRANSACTION или нет. Например, инструкция INSERT, вставляющая 25 строк, является логической единицей работы. Все и каждая из этих 25 строк должны быть обновлены. Даже обновление одной строки представляет собой транзакцию, включающую операции, работающие с данными и индексами, которые либо должны быть выполнены в целом, либо в целом не должны быть выполнены.

Чтобы создать оболочку для множества команд одной транзакцией, требуется совсем немного кода: один компонент, служащий началом транзакции, другой— в конце. В конце транзакции она может либо подтверждаться после отправки на диск, либо откатываться. если в коде встретилась ошибка. Следующие три инструкции выглядят простыми, однако за ними стоит довольно сложный механизм:

?               BEGIN TRANSACTION

?               COMMIT TRANSACTION

?               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 <> 0 BEGIN

ROLLBACK TRANSACTION;

RAISERROR(‘Ошибка складской транзакции 1, 16, 1);

RETURN;

END;

INSERT InventoryTransaction (InventorylD, Location, Quantity)

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

IF @@Error <> 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 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии