Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Управление транзакциями в среде MS SQL Server




ELSE

COMMIT TRAN

END

ROLLBACK TRAN

BEGIN

END

ROLLBACK TRAN

BEGIN

BEGIN TRAN

IF (SELECT COUNT (Поставки.Количество_ед_товара)

FROM Товары INNER JOIN Поставки

ON Товары. ID_товара = Поставки.Товар

WHERE Товары.Название_товара = ‘Кофе Ирландский крем’) >=400

RETURN

UPDATE Продажи

SET Цена_ед_товара = Цена_ед_товара + 500

FROM Товары INNER JOIN Продажи

ON Товары. ID_товара = Продажи.Товар

WHERE Товары.Название_товара = ‘Кофе Ирландский крем’

 

-- анализ кода ошибки производится при обновлении таблицы

IF @@error <>0

RETURN

В этом примере команда begin tran сообщает серверу о начале транзакции. Это означает, что до получения сервером команды завершения транзакции (commit tran) все изменения являются временными. Следовательно, если на сервере произойдет сбой после первого обновления, выполнится откат транзакции.

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

Чтобы обеспечить согласованность транзакций, в этом примере блокируется модификация данных до завершения транзакции.

Термин "блокировка" (lock) означает, что никакой процесс не сможет обратиться к данным до их освобождения (посредством закрепления или отката транзакции). Только процесс, являющийся владельцем блокировки, сможет просмотреть заблоки­рованные данные.

Если во время транзакции произойдут ошибки (или если этого требует логи­ка программы), выполняется команда rollback tran.

Команды управления транзакциями не влияют на последовательность вы­полнения программы.

Примечание

Команда rollback tran не влияет на последовательность выполнения ко­манд программы. Следовательно, после отката необходимо выполнить коман­ду RETURN.

 

Пример 2. В этом примере иллюстрируется последова­тельность выполнения транзакций.

BEGIN TRAN Tr1

INSERT MyTable VALUES (1)

PRINT @@TRANCOUNT -- значение = 1

SAVE TRAN Point_1

INSERT MyTable VALUES (2) -- здесь может быть любой SQL-код

 

-------- Если возникла ошибка, откат к точке Point_1

IF @@error <> 0

ROLLBACK TRAN Point_1

---------- Если кол-во записей >3, осуществляется откат к началу транзакции

IF (SELECT COUNT (*) FROM MyTable) > 3

ROLLBACK TRAN Tr1

INSERT MyTable VALUES (3) -- здесь может быть любой SQL-код

------- Если возникла ошибка, откат к началу транзакции

IF @@error <> 0

ROLLBACK TRAN Tr1

COMMIT TRAN Tr1

Здесь после открытия транзакции добавляется запись в таблицу MyTable. Эта добав­ленная запись уже находится в таблице, но может участвовать в запросах только со сторо­ны процесса, открывшего транзакцию. Она будет недоступна со стороны всех остальных процессов до закрепления транзакции.

Команда save tran используется в качестве "закладки". Она не влияет на значение @@trancount и не изменяет уровня вложенности транзакции, она лишь позволяет позднее вернуть транзакцию к этой точке.

Серверзапоминает факт начала транзакции, обновляя глобальную перемен­ную @@trancount. Вначале переменная @@trancount равна 0. Она увеличива­ется на 1 для каждой новой вложенной транзакции.

 

В SQL Server транзакция определяется на уровне со­единения с базой данных, а при закрытии соединения автоматически за­крывается.

Когда тран­закция начинается, все команды, выполненные в текущем соединении, считаются телом одной транзакции, пока не будет достигнут ее конец.

Пользователи в основном должны указывать только начало и конец транзакции, используя команды SQL или API (прикладного интерфейса программирования).

Если пользователь попытается установить соединение снова и продолжить выполнение транзакции, то это не удастся.

 

SQL Server поддерживает три вида определения транзакций:

• автоматическое;

• явное;

• неявное (подразумеваемое).

 

По умолчанию SQL Server работает в режиме автоматического нача­ла транзакций, когда каждая команда рассматривается как отдельная транзакция.

При этом если отдельная команда выполнена успешно, то ее изменения фикси­руются. Если при выполнении команды произошла ошибка, то сделан­ные изменения отменяются и система возвращается в первоначальное состояние.

 

Если пользователю необходимо создать транзакцию, включающую несколько команд, он должен явно указать транзакцию (установить режим явного определения).

Установка режима явного опре­деления транзакций выполняется посредством другой команды:




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 1441; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.