КАТЕГОРИИ: Архитектура-(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; Просмотров: 1545; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |