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

Самостоятельные работы / Транзакции в SQL

.doc
Скачиваний:
44
Добавлен:
09.12.2018
Размер:
137.22 Кб
Скачать

Транзакции, оперативная обработка транзакций (OLTP).

Цель: изучение принципов описания транзакций для баз данных в MS SQL Server.

Поддержка транзакций сервером MS SQL Server

MSSQL Server поддерживает стандартную и расширенную модели транзакций. С точки зрения правил выполнения транзакции можно разделить на следующие 3 типа:

  • Явные транзакции. Для таких транзакций в программном коде требуется указывать операторы начала и завершения транзакции.

  • Автоматические транзакции. По умолчанию MS SQL Server работает в режиме автоматических транзакций, когда каждая команда модификации данных рассматривается как самостоятельная транзакция.

  • Неявные транзакции. При указании данного режима при подключении к серверу сервер автоматически заканчивает текущую транзакцию и начинает новую, при условии, что будет выполнена одна из команд:

    • Alter table – изменение схемы таблицы;

    • Create – создание любого объекта БД;

    • Delete – удаление строк из таблицы;

    • Drop – удаление любого объекта БД;

    • Fetch – извлечение строки из курсора;

    • Grant – назначение прав доступа к объектам БД;

    • Insert – добавление строк в таблицу;

    • Open – открытие курсора;

    • Revoke – отклонение прав доступа к объектам БД;

    • Select выбора из одной или нескольких таблиц;

    • Truncate Table – усечение таблицы – удаление всех записей из таблицы;

    • 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 обновить статистику.

Кроме того, запрещено в транзакциях использовать любую хранимую процедуру, которая изменяет системную БД Master.

Для решения проблем параллельной работы транзакций MS SQL Server использует блокировки (Locks).

Для управления транзакциями в MS SQL Server 2000 ведутся журналы транзакции. Журнал транзакций ведется в каждой БД, в него сервер заносит все сведения о каждой транзакции. Все изменения, произошедшие от начала транзакции, сначала кэшируются. Если во время выполнения транзакции произошла ошибка или исполнена команда ROLLBACK TRANSACTION, сервер проводит откат практически фиксирую команду отката в журнале. Если же получена команда подтверждения удачного завершения транзакции, то данные Кэша записываются на диск, а в журнал транзакций заносится информация о фиксации транзакции. При запуске сервер просматривает журнал и осуществляет откат всех незавершенных транзакций. При полной потере БД достаточно ее резервной копии и журнала транзакций для восстановления.

Журнал транзакций может соcтоять из одного или нескольких файлов. Весь журнал разбивается на части, называемые виртуальными журналами, минимальный размер виртуального журнала составит 256 Кб. Количество виртуальных журналов и их размеры зависят от скорости увеличения журнала и регулируются автоматически. Как только все транзакции, зарегистрированные в виртуальном журнале, были завершены, он становится доступным для занесения новой информации, т.е. происходит урезание журнала транзакций (Truncate). Если свободных виртуальных журналов нет, а записывать новую транзакцию надо, то сервер автоматически увеличит размер файла журнала транзакций или выдаст сообщение об ошибке. При много файловом хранении журнала транзакций сначала увеличивается первый файл, потом второй и т.д.

Для отслеживания происходящих на сервере событий в Enterprise Manager следует обратиться к разделу

Management->Current Activity

он содержит папку Process Info, которая позволяет получить полный список процессов (см. рис.1).

Рис. 1. Список процессов на сервере

В свою очередь каждый процесс характеризуется 21-м параметром. Дважды щелкнув по интересующему нас процессу можно получить в окно свойств данного процесса (см. рис. 2)

Рис. 2. Окно свойств процесса.

В этом окне показана последняя выполненная команда процесса. Можно послать процессу сообщение, можно уничтожить процесс, или обновить данные о нем.

Ссылка Locks/Process ID – содержит информацию о процессах, блокирующих один или несколько ресурсов (см. рис. 3).

Рис. 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

}

Уровень изолированности транзакций может быть установлен непосредственно в операциях изменения данных.

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 записями, введите разные годы издания, в большинстве 2017 или 2018.

  2. В Query Analyzer установите уровень изолированности транзакции максимальный

  3. Напишите команду начала транзакции

  4. внутри транзакции напишите команду обновления таблицы Books, увеличив на 1 все годы издания, которые менее текущего.

Текущий год вычисляется стандартными функциями Year(Getdate())

Используйте уровень блокировки – таблица и сделайте блокировку исключительной (XLOCK)

  1. Не завершать транзакцию оператором COMMIT.

  2. В новом окне набрать команду вывода всех строк из таблицы Books.

  3. Зафиксируйте результат в виде скриншотов, напишите объяснение полученному результату.

  4. Допишите отдельно команду COMMIT в первом окне и выделив ее выполните, проанализируйте изменение второго окна, зафиксируйте и прокомментируйте.

  5. Проделайте аналогичную операцию со столбцом стоимость книг, увеличив стоимость на 10 рублей для каждой книги, изданной в текущем году. Установите минимальный уровень изолированности и так же не завершайте транзакцию и запустите в соседнем окне просмотр таблицы. Зафиксируйте результаты и прокомментируйте.

  6. Подготовьте отчет.

Соседние файлы в папке Самостоятельные работы