БД_лабы(11 лаб, 5 семестр) / БД_ЛР10
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Систем автоматизированного проектирования
отчет
по лабораторной работе №10
по дисциплине «Базы Данных»
Тема: УПРАВЛЕНИЕ ТРАНЗАКЦИЯМИ И БЛОКИРОВКАМИ
Студенты гр. 3352 |
________________ |
Гареева К.Р. |
|
________________ |
Жигунова О.М. |
Преподаватель |
________________ |
Горяинов С.В. |
Санкт-Петербург
2025
Цель работы
Получить представление о транзакциях и блокировках. В этой работе применяется база данных Adventure Works.
Ход работы
Упражнение 1 - применение транзакций:
Запрос 1:
Откроем файл Tran1.sql. В комментарии START TRANSACTION HERE и добавим команду BEGIN TRANSACTION и выполним сценарий. На этом этапе транзакция по-прежнему активна, и блокировки все еще удерживаются. Внесенные изменения зафиксированы в базе данных (рис. 1).
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
SELECT FirstName, MiddleName, LastName FROM Person.Contact WHERE ContactID = 342
SELECT @@trancount AS 'Transaction Count'
Рисунок 1 - Результат выполнения запроса 1.
Запрос 2:
Добавим COMMIT TRANSACTION, чтобы закрыть транзакцию. В итоге Transaction Count = 0 (рис. 2). Изменения в базе данных зафиксированы.
Рисунок 2 - Результат выполнения запроса 2.
Упражнение 2 выполнение отката транзакций:
Запрос 3:
Напишем запрос с командой ROLLBACK TRANSACTION, которая отменяет все изменения, сделанные с момента BEGIN TRANSACTION. Данные возвращаются в исходное состояние (рис. 3).
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'
Рисунок 3 - Результат выполнения запроса 3.
Упражнение 3 просмотр сведений о блокировках:
В дереве консоли найдем Activity Monitor и просмотрим сведения, которые отображаются в разделах «Сведения о процессе» (Process Info), «Блокировки по процессам» (Locks by Process) и «Блокировки по объектам» (Locks by Objects) (рис. 4).
Рисунок 4 - Просмотр Active Monitor.
Запрос 4:
Напишем запрос, который покажет информацию о блокировках, а именно типы ресурсов, режимы блокировок и статусы запросов (рис. 5).
SELECT resource_type, request_mode, request_type, request_status, request_session_id
FROM sys.dm_tran_locks;
Рисунок 5 - Результат выполнения запроса 4.
Запрос 5:
Далее напишем программу, которая выполнит начало транзакции, временно изменит данные, установит блокировки и выведет скорость. Так как нет COMMIT или ROLLBACK, транзакция не будет завершена и изменения не будут сохранены в БД. Блокировки удерживаются - могут блокировать других пользователей (рис. 6).
USE AdventureWorks
BEGIN TRANSACTION
UPDATE Person.Contact
SET FirstName = 'Fran'
WHERE ContactID = 6
SELECT @@spid AS 'spid'
Рисунок 6 - Результат выполнения запроса 5.
Запрос 6:
Напишем запрос, который предоставляет реальную информацию о текущих блокировках в системе и отображает снимок блокировок в момент выполнения запроса (рис. 7).
SELECT
resource_type,request_mode,request_type,request_ status,request_session_id
FROM sys.dm_tran_locks;
Рисунок 7 - Результат выполнения запроса 6.
Запрос 7:
Теперь снимем блокировки с помощью ROLLBACK и просмотрим запрос 6 еще раз. Блокировки снятым (рис. 8).
USE AdventureWorks
BEGIN TRANSACTION
UPDATE Person.Contact
SET FirstName = 'Fran'
WHERE ContactID = 6
SELECT @@spid AS 'spid'
ROLLBACK TRANSACTION;
Рисунок 8 - Результат выполнения запроса 7.
Упражнение 4- настройка параметров блокировки
Запрос 8
Напишем запрос с установкой изоляции и таймаута. SERIALIZABLE запрещает другим транзакциям модифицировать данные и добавлять новые строки, которые удовлетворяют условиям WHERE (рис. 9). Запрос будет ждать 5 секунд на освобождение блокировки.
USE AdventureWorks
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET lock_timeout 5000
BEGIN TRANSACTION
SELECT * FROM Person.Contact WHERE ContactID = 10
UPDATE Person.Contact SET FirstName = 'Frances' WHERE ContactID = 6
SELECT @@spid AS 'SPID'
Рисунок 9 - Результат выполнения запроса 8.
Запрос 9
Выполним запрос из файла LockList.sql (рис. 10). Обратим внимание на присутствие в столбце request_status записи WAIT, указывающей на ожидание вторым запросом предоставления блокировки, прежде чем будет продолжено его выполнение.
SELECT resource_type, request_mode,request_type, request_status, request_session_id
FROM sys.dm_tran_locks
Рисунок 10 - Результат выполнения запроса 9.
После этого мы отменим выполнение первой транзакции в Lock1.sql с помощью кнопки Cancel Executing Query.
Рисунок 10 - Отмена выполнения с помощью Cancel Eхеcuting Query.
Запрос 10
Установим таймаут блокировки, отредактировав запрос, добавив команду перед командой BEGIN TRANSACTION:
SET lock_timeout 5000
Выполним запрос. Обратим внимание, что запрос больше не ожидает неопределенно долго предоставления блокировки и завершается через 5 секунд с выводом сообщения в messages (рис. 11).
Рисунок 11 - Результат выполнения запроса 10.
Вывод
В ходе лабораторной работы было получено представление о механизмах транзакций и блокировок в SQL Server, где был изучен принципы управления транзакциями через команды BEGIN TRANSACTION, COMMIT (для фиксации изменений) и ROLLBACK (для отката), исследовано различные типы блокировок с помощью системного представления sys.dm_tran_locks и монитора активности, а также проанализировано влияние уровней изоляции (в частности, SERIALIZABLE) и параметров блокировки (lock_timeout) на параллельный доступ к данным, что позволило понять важность правильного управления транзакциями для обеспечения целостности данных и предотвращения конфликтов в многопользовательской среде.
