МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE ТЕМА 7. ТРАНЗАКЦИИ, ОПЕРАТИВНАЯ ОБРАБОТКА ТРАНЗАКЦИЙ (OLTP). ПРАКТИЧЕСКАЯ РАБОТА (1 ЧАС.) Цель: изучение принципов описания транзакций для баз данных в MS SQL Server 2000 Для достижения поставленной цели необходимо решить следующие задачи: Изучить операторы начала транзакций и уровней изолированности пользователей при работе на сервере MS SQL Server 2000 Установить разный уровень изолированности при работе при работе с таблицами БД «Библиотека». Зафиксировать и проанализировать полученные результаты и подготовить отчет о проделанной работе в электронном виде. Оглавление. Поддержка транзакций сервером MS SQL Server 2000 .........................................................1 Управление транзакциями через программный код. .............................................................5 Задание 1.....................................................................................................................................6 Поддержка транзакций сервером MS SQL Server 2000 MSSQL server 2000 поддерживает стандартную и расширенную модели транзакций. С точки зрения правил выполнения транзакции можно разделить на следующие 3 типа: Явные транзакции. Для таких транзакций в программном коде требуется указывать операторы начала и завершения транзакции. Автоматические транзакции. По умолчанию MS SQL Server 2000 работает в режиме автоматических транзакций, когда каждая команда модификации данных рассматривается как самостоятельная транзакция. Неявные транзакции. При указании данного режима при подключении к серверу сервер автоматически заканчивает текущую транзакцию и начинает новую, при условии, что будет выполнена одна из команд: o Alte table – изменение схемы таблицы; o Create – создание любого объекта БД; o Delete – удаление строк из таблицы; o Drop – удаление любого объекта БД; o Fetch – извлечение строки из курсора; o Grant – назначение прав доступа к объектам БД; o Insert – добавление строк в таблицу; o Open – открытие курсора; МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE o Revoke – отклонение прав доступа к объектам БД; o Select выбора из одной или нескоьких таюлиц; o Truncate Table – усечение таблицы – удаление всех записей из таблицы; o Update – обновление таблицы. Транзакции продолжаются до тех пор, пока: Соединение не будет разорвано; Не получена команда COMMIT TRANSACTION; Не выполнена команда ROLLBACK TRANSACTION При выполнении команд COMMIT TRANSACTION и ROLLBACK TRANSACTION следующая транзакция начинается автоматически. В результате генерируется непрерывная цепь транзакций. Для включения неявного типа транзакция используется команда SET IMPLICIT_TRANSACTION ON Для выключения данного режима используется команда SET IMPLICIT_TRANSACTION OFF Распределенные транзакции.(Distributed Transaction). Эти транзакции используются при обращении к другим базам данных. В этом процессе происходит координация выполнения нескольких локальных транзакций в каждой базе данных, с которыми осуществляется взаимодействие. Работу по контролю над выполнением распределенных транзакций осуществляет координатор распределенных транзакций (Distributed Transaction Coordinator,DTC)/ Координатор гарантирует, что все локальные транзакции будут либо зафиксированы, либо произойдет их откат. Вложенные транзакции (Nested transaction)/ Внутри явных транзакций можно инициировать новые явные транзакции. Все вложенные транзакции будут завершены только после окончания самой внешней транзакции. Иногда вложенные транзакции удобно использовать в хоанмых процедурах. В транзакциях запрещено использовать ряд команд, потому что для них сложно организовать откат. Запрещенные команды: ALTER Database – изменение режимов текущей БД BACKUP LOG – резервное копирование журнала транзакций CREATE DATABASE созданное новой БД DROP DATABASE удаление БД RESTORE DATABASES восстановление БД из резервной копии RESTORE LOG восстановить журнал транзакций из резервной копии UPDATE STATISTIC обновить статистику. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Кроме того запрещено в транзакциях использовать любую хранимую процедуру, которая изменяет системную БД Master. Для решения проблем параллельной работы транзакций MS SQL Server 2000 использует блокировки (Locks). Для управления транзакциями в MS SQL Server 2000 ведутся журналы транзакции. Журнал транзакций ведется в каждой БД, в него сервер заносит все сведения о каждой транзакции. Все изменения, произошедшие от начала транзакции, сначала кешируются. Если во время выполнения транзакции произошла ошибка или исполнена команда ROLLBACK TRANSACTION, сервер проводит откат практически фиксирую команду отката в журнале Если же получена команда подтверждения удачного завершения транзакции, то данные Кеша записываются на диск, а в журнал транзакций заносится информация о фиксации транзакции. При запуске сервер просматривает журнал и осуществляет откат всех незавершенных транзакций. При полной потере БД достаточно ее резервной копии и журнала транзакций для восстановления. Журнал транзакций может соcтоять из одного или нескольких файлов. Весь журнал разбивается на части, называемые виртуальными журналами, минимальный размер виртуального журнала составит 256 Кб. Количество виртуальных журналов и их размеры зависят от скорости увеличения журнала и регулируются автоматически. Как только все транзакции, зарегистрированные в виртуальном журнале были завершены, он становится доступным для занесения новой информации, т.е. происходит урезание журнала транзакций (Truncate)/ Если свободных виртуальных журналов нет, а записывать новую транзакцию надо, то сервер автоматически увеличит размер файла журнала транзакций или выдаст сообщение об ошибке. При многофайловом хранении журнала транзакций сначала увеличивается первый файл, потом второй и т.д. Для отслеживания происходящих на сервере событий в Enterprise Manager следует обратиться к разделу Management->Current Activity он содержит папку Process Info, которая позволяет получить полный список процессов (см. рис.1). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 1. Список процессов на сервере В свою очередь каждый процесс характеризуется 21-м параметром. Дважды щелкнув по интересующему нас процессу можно получить в окно свойств данного процесса (см. рис. 2) Рис. 2. Окно свойств процесса. В этом окне показана последняя выполненная команда процесса. Можно послать процессу сообщение, можно уничтожить процесс, или обновить данные о нем. Ссылка Locks/Process ID – содержит информацию о процессах, блокирующих один или несколько ресурсов (см. рис. 3). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 3. Список заблокированных объектов одного процесса. Управление транзакциями через программный код. Начало транзакции на языке Transact SQL задается оператором BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable [ WITH MARK [ 'description' ] ] ] Здесь transaction_name – имя транзакции, не более 32 символов. @tran_name_variable – имя переменной, содержащее имя транзакции. WITH MARK [ 'description' ] - конструкция, позволяющая пометить транзакция и описать эту метку (description). MS SQL Server поддерживает все стандартные уровни изолированности транзакций. Установка уровня изолированности производится командой: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE } МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Уровень изолированности транзакций может быть установлен непосредственно в операциях изменения данных. UPDATE <имя таблицы> WITH (<уровень блокировки>,<тип блокировки>) Поддерживаются следующие уровни блокировки: ROWLOCK- блокировка на уровне строк PAGLOCK - Блокировка на уровне страниц TABLOCK Блокировка на уровне таблиц Можно задавать следующие виды блокировок: NOLOCK – минимальный уровень изоляции с разрешением чтения грязных данных XLOCK – монопольная блокировка SERALLIZABLE READUNCOMMITED READ COMMITED Пример. UPDATE Exemplar With (TABLOCK, XLOCK) Set Data_return = data_return+ 14 Where Data_Return is not Null and Data_In > Getdate() – 14 Задание 1. 1. Заполните таблицу «Книги» не менее чем 25 записями, введите разные годы издания, в большинстве 2004 или 2005. 2. В Query Analyzer установите уровень изолированности транзакции максимальный 3. Напишите команду начала транзакции 4. внутри транзакции напишите команду обновления таблицы Books, увеличив на 1 все годы издания, которые менее текущего. Текущий год вычисляется стандартными функциями Year(Getdate()) Используйте уровень блокировки – таблица и сделайте блокировку исключительной (XLOCK) 5. Не завершать транзакцию оператором COMMIT. 6. В новом окне набрать команду вывода всех строк из таблицы Books. 7. Зафиксируйте результат в виде скриншотов, напишите объяснение полученному результату. 8. Допишите отдельно команду COMMIT в первом окне и выделив ее выполните, проанализируйте изменение второго окна, зафиксируйте и прокомментируйте. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE 9. Проделайте аналогичную операцию со столбцом стоимость книг, увеличив стоимость на 10 рублей для каждой кнги, изданной в текущем году. Установите минимальный уровень изолированности и так же не завершайте транзакцию и запустите в соседнем окне просмотр таблицы. Зафиксируйте результаты и прокомментируйте. 10. Подготовьте отчет в электронном виде.