- •Теоретический материал
- •Определение явных транзакций
- •Особые сценарии rollback
- •Установка уровней изоляции
- •Функции ident_current, scope_identity, @@identity
- •Ident_current возвращает последнее значение идентифицирующего столбца, созданное для конкретной таблицы в любом сеансе и области поиска.
- •Содержание работы
Функции ident_current, scope_identity, @@identity
Для того, что бы узнать последний добавленный идентификатор (IDENTITY), используются функции IDENT_CURRENT, SCOPE_IDENTITY и @@IDENTITY.
Функция IDENT_CURRENT практически аналогична функциям удостоверений SQL Server SCOPE_IDENTITY и @@IDENTITY. Все три функции возвращают созданные последними значения идентификаторов. Однако эти функции различаются областью действия и сеансом.
Ident_current возвращает последнее значение идентифицирующего столбца, созданное для конкретной таблицы в любом сеансе и области поиска.
@@IDENTITY возвращает последнее значение идентификатора, созданное для любой таблицы в текущем сеансе по всем областям поиска.
SCOPE_IDENTITY возвращает последнее значение идентификатора, созданное для любой таблицы в текущем сеансе по текущей области поиска.
Функция IDENT_CURRENT возвращает значение NULL, если вызвана для пустой таблицы или для таблицы без столбца идентификаторов.
Инструкции и транзакции, приведшие к ошибке, могут изменять текущее удостоверение для таблицы и вызывать появление пропусков в значениях столбца идентификаторов. Откат удостоверения не производится никогда, несмотря на то, что транзакция, пытавшаяся вставить в таблицу значение, не была зафиксирована. Например, если инструкция INSERT привела к ошибке из-за нарушения ограничения IGNORE_DUP_KEY, текущее удостоверение для таблицы все равно увеличивается.
Будьте внимательны при использовании функции IDENT_CURRENT для прогнозирования следующего создаваемого значения идентификатора. В действительности создаваемое значение может отличаться от полученного с помощью функции IDENT_CURRENT плюс IDENTITY_SEED, потому что в других сеансах могут выполняться операции вставки [3].
Содержание работы
Добавьте в таблицу товар (Product) поле количество (Quantity). Заполните поле произвольными значениями от 0 до 100.
Создайте хранимую процедуру AddBill, которая будет формировать чек, а затем возвращать его идентификатор. Входные параметры процедуры: BuyerID и EmployeeID. Все инструкции данной хранимой процедуры должны выполняться в транзакции.
Создайте хранимую процедуру добавления товара в чек. Назовите ее AddBillItem. Входные параметры процедуры: BillID, ProductID, Quantity. Установить уровень изоляции транзакции в режим SERIALIZABLE. После открытия транзакции (BEGIN TRANSACTION) необходимо проверить количество товара в магазине. В случае если товара в магазине недостаточно, то процедура должна завершить выполнение транзакции (ROLLBACK TRANSACTION). В противном случае хранимая процедура уменьшает доступное количество товара в магазине и добавляет запись о покупке в чек (добавляются записи в таблицу BillItem). Закрываем транзакцию (COMMIT TRANSACTION). Объясните выбор уровня изоляции транзакции.
Сделайте выборку содержимого чека с использованием запроса №1 из лабораторной работы №2.
Проверьте работоспособность написанных хранимых процедур. Попытайтесь создать чек и добавить в него 2 товара с достаточным в магазине количеством и 1 товар с недостаточным количеством. Убедитесь, что в чеке присутствуют только 2 проданных товара.
Подготовьте материал для включения в отчетную презентацию по курсу Базы данных: специальный курс.
