Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
12.41 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Систем автоматизированного проектирования

отчет

по лабораторной работе №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) на параллельный доступ к данным, что позволило понять важность правильного управления транзакциями для обеспечения целостности данных и предотвращения конфликтов в многопользовательской среде.

Соседние файлы в папке БД_лабы(11 лаб, 5 семестр)