- •Лабораторная работа №1: Создание баз данных
- •Лабораторная работа №2: Создание таблиц и ограничений
- •Лабораторная работа №3: Основы Transact sql: Простые (однотабличные) выборки данных
- •Запросы на выборку данных (оператор select)
- •Лабораторная работа №4: Основы Transact sql: Сложные (многотабличные запросы)
- •Подзапросы
- •Операции соединения
- •Множественные операции
- •Лабораторная работа №5: Основы Transact sql: Добавление, изменение и удаление данных в таблицах
- •Добавление новых записей
- •Удаление записей
- •Изменение данных
- •Лабораторная работа №6: Представления
- •Создание представлений в Management Studio
- •Создание представлений с помощью кода sql
- •Предложение order by и представления
- •Выполнение представлений
- •Лабораторная работа №7: Программирование на t-sql Синтаксис и соглашения t-sql
- •Переменные
- •Средства управления потоком команд. Программные конструкции
- •Лабораторная работа №8: Хранимые процедуры
- •Лабораторная работа №9: Функции Системные функции
- •Пользовательские функции
- •Лабораторная работа №10: Обработка ошибок. Управление транзакциями. Триггеры. Обработка ошибок. Блок try…catch.
- •Активация сообщений об ошибках вручную. Инструкция raiserror
- •Управление транзакциями
- •Триггеры
Управление транзакциями
Концепция транзакций – неотъемлемая часть любой клиент-серверной базы данных.
Под транзакциейпонимается неделимая с точки зрения воздействия на БД последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации), приводящая к одному из двух возможных результатов: либо последовательность выполняется целиком, если все операторы правильные, либо вся транзакция откатывается, если хотя бы один оператор не может быть успешно выполнен. Обработка транзакций гарантирует целостность информации в базе данных. Таким образом, транзакция переводит базу данных из одного целостного состояния в другое.
Для примера рассмотрим базу данных, управляющую банковскими счетами. Предположим, что необходимо перевести деньги с одного счета на другой. Это предполагает две операции:
уменьшение баланса исходящего счета;
увеличение баланса принимающего счета.
Если одна из этих операций завершается ошибкой, вторая также должна быть отменена, в противном случае база данных потеряет целостность. Эти две операции совместно составляют единую транзакцию, которая может быть либо целиком выполнена, либо целиком отменена.
Большинство выполняемых действий производится в теле транзакций. По умолчанию каждая команда выполняется как самостоятельная транзакция. При необходимости пользователь может явно указать ее начало и конец, чтобы иметь возможность включить в нее несколько команд. Для этого используются следующие команды:
BEGIN TRAN[SACTION] – объявление начала транзакции (в журнале транзакций фиксируются первоначальные значения изменяемых данных и момент начала транзакции).
COMMIT TRAN[SACTION] – фиксация транзакции (если в теле транзакции не было ошибок, то эта команда предписывает серверу зафиксировать все изменения, сделанные в транзакции, после чего в журнале транзакций помечается, что изменения зафиксированы и транзакция завершена).
ROLLBACK TRAN[SACTION] – откат транзакции (когда сервер встречает эту команду, происходит откат транзакции (отмена всех изменений), восстанавливается первоначальное состояние системы и в журнале транзакций отмечается, что транзакция была отменена).
Рассмотрим следующий пример.
Откройте новое окно запроса и выберите Salesв качестве активной базы данных
Введите и выполните следующий запрос
BEGIN TRANSACTION
Будет запущена транзакция. Все модификации данных в этом соединении не будут видны для других соединений.
Введите и выполните следующий запрос
INSERT City
VALUES ('Новый город')
Чтобы проверить, что модификация прошла успешно, введите и выполните следующий запрос
SELECT *
FROM City
В таблице появилась новая запись, но эти изменения видны только в данном соединении
Откройте новое окно запроса, введите и выполните в нем предыдущий запрос. Запрос не вернет результатов, поскольку он ждет завершения транзакции, запущенной в другом окне.
Вернитесь в первое окно, введите и выполните следующий запрос
ROLLBACK TRANSACTION
Модификация данных отменена. Вернитесь во второе окно. Обратите внимание, что запрос выполнился и вернул данные. Добавленная строка отсутствует.
Операция оформления нового заказа предполагает добавление новых записей сразу в две таблицы: OrderиOrdItem. Реализуем данную двойную операцию в виде единой транзакции:
BEGIN TRAN
BEGIN TRY
INSERT [Order](IdCust)
VALUES (2)
INSERT OrdItem(IdOrd,IdProd,Qty,Price)
VALUES (SCOPE_IDENTITY(),1,1,5)
END TRY
BEGIN CATCH
ROLLBACK TRAN
RAISERROR('Ошибка',16,1)
RETURN
END CATCH
COMMIT TRAN