- •Часть 3
- •Часть 3-6. Обеспечение целостности данных Упражнение 1 – Создание новой таблицы и применение ограничений целостности
- •Упражнение 2 – отключение ограничений
- •Часть 3-7. Использование представлений Упражнение 1 – Создание представления
- •Упражнение 2 – создание индексированного представления
- •Упражнение 3 – просмотр системной информации о представлениях
- •Часть 3-8. Создание и использование хранимых процедур Упражнение 1 - Создание хранимой процедуры без параметров
- •Упражнение 2 – создание хранимой процедуры с параметром
- •Упражнение 3 – создание хранимой процедуры с параметрами и значениями по умолчанию
- •Часть 3-9. Создание udf
- •Упражнение 1 - Создание скалярной функции
- •Упражнение 2 - Создание функции, возвращающей табличное значение (I-l t-V udf)
- •Упражнение 3 - Контроль контекста выполнения
- •Часть 3-10. Управление транзакциями и блокировками
- •Упражнение 1 - Применение транзакций
- •Упражнение 2 - Выполнение отката транзакций
- •Упражнение 3 - Просмотр сведений о блокировках
- •Упражнение 4 - Настройка параметров блокировки
- •Часть 3-11. Создание триггеров
- •Упражнение 1 - Создание новой таблицы
- •Упражнение 2 - Создание триггера для таблицы
- •Упражнение 3 – Проверка работы триггера
- •Упражнение 4 – Создание триггера на обновление и вставку
Часть 3-10. Управление транзакциями и блокировками
Цель работы: получение представления о транзакциях и блокировках.
Задание: Использование операторов BEGIN TRANSACTION и COMMIT TRANSACTION, чтобы понять, как влияют данные операции на изменение данных.
Упражнение 1 - Применение транзакций
Откроем файл Tran1.sql. В сценарии производится обновление записи в таблице Person.Contact. Инструкция SELECT и глобальная переменная @@trancount используютcя, чтобы показать ход выполнения транзакции. Нашли комментарий START TRANSACTION HERE и добавили команду BEGIN TRANSACTION.
Транзакция все еще активна и блокировки удерживаются. Внесенные изменения не зафиксированы в базе данных. Вставим команду COMMIT TRANSACTION после комментария END TRANSACTION HERE. Теперь изменения будут зафиксированы.
USE AdventureWorks
-- START TRANSACTION HERE
BEGIN TRANSACTION
SELECT @@trancount AS 'Transaction Count'
SELECT FirstName, MiddleName, LastName FROM Person.Contact WHERE ContactID = 342
UPDATE Person.Contact SET FirstName = 'Lin' WHERE ContactID = 342
-- END TRANSACTION HERE
COMMIT TRANSACTION
SELECT FirstName, MiddleName, LastName FROM Person.Contact WHERE ContactID = 342
SELECT @@trancount AS 'Transaction Count'
Запустим запрос и посмотрим результат:
Рис 1. Применение тразакции
В итоге изменения в базе данных зафиксировались.
Упражнение 2 - Выполнение отката транзакций
Откроем файл Tran2.sql. В сценарии с помощью команды UPDATE обновляется другая запись в таблице Person.Contact. Команда SELECT и глобальная переменная @@trancount используются, чтобы показать ход выполнения транзакции.
USE AdventureWorks
BEGIN TRANSACTION
SELECT @@trancount AS 'Transaction Count'
SELECT FirstName, MiddleName, LastName FROM Person.Contact WHERE ContactID = 7454
UPDATE Person.Contact SET FirstName = 'Dom' WHERE ContactID = 7454
SELECT FirstName, MiddleName, LastName FROM Person.Contact WHERE ContactID = 7454
SELECT @@trancount AS 'Transaction Count'
-- END TRANSACTION HERE
ROLLBACK TRANSACTION
SELECT FirstName, MiddleName, LastName FROM Person.Contact WHERE ContactID = 7454
SELECT @@trancount AS 'Transaction Count'
Рис 2. Результат отката
Упражнение 3 - Просмотр сведений о блокировках
Открываем Activity Monitor. Выбираем опцию «Процессы». Посмотрим сведения по разделам:
Рис 3. Монитор активности
Напишем запрос к динамическому представлению в текущем соединении.
Рис 4. Результат запроса
Открываем файл Lock1.sql. В сценарии присутствует команда BEGIN TRANSACTION , но нет команд ROLLBACK TRANSACTION и COMMIT TRANSACTION.
Выполняем:
USE AdventureWorks
BEGIN TRANSACTION
UPDATE Person.Contact
SET FirstName = 'Fran'
WHERE ContactID = 6
-- For the purpose of the exercise, COMMIT TRANASACTION or ROLLBACK TRANSACTION are not used.
SELECT @@spid AS 'spid'
-- Use the SPID to identify the connection when using sys.dm_tran_locks.
Рис. 5. Результат
Далее пишим запрос:
SELECT resource_type,request_type,request_status,request_session_id
FROM sys.dm_tran_locks
Рис. 6. Результат запроса
Добавляем в сценарий команду ROLLBACK, чтобы убедиться в том, что блокировки сняты.
Рис. 7