Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Microsoft SQL.doc
Скачиваний:
27
Добавлен:
16.12.2018
Размер:
1.83 Mб
Скачать

2. Тестирование триггера:

UPDATE authsmall SET au_lname = ‘Geitsi’,

au_fname = ‘Billy’ WHERE au_lname = ‘Smith’.

Лабораторная работа №13

Создание и управление транзакциями

Цель работы – изучение способов обеспечения надежной работы SQL Server 2000 с помощью механизма транзакций и контрольных точек, приобретение навыков управления локальными и распределенными транзакциями различных видов, а также ознакомление с физической и логической архитектурой журнала транзакций и способами восстановления баз данных.

Одним из способов повышения надежности работы системы MS SQL Server 2000 является применение встроенного в систему механизма транзакций и контрольных точек и умелое его управление.

Транзакция – это одна или несколько последовательных команд языка Transact – SQL, образующих логически завершенный пакет и выполняемых как единое целое. Если по какой-либо причине хотя бы одна из команд пакета не выполняется, то происходит откат системы к состоянию, в котором она была до начала транзакции, и транзакция считается не выполненной. По умолчанию каждая команда выполняется как самостоятельная транзакция. При необходимости в пакете можно явно указать начало и конец транзакции.

Обработка транзакций в любой системе управления базами данных должна производиться с соблюдением следующих правил – правил ASID (Atomicity, Consistency, Isolation и Durability):

Atomicity – атомарность: выполняемые в транзакции изменения либо выполняются все,

либо не выполняются вовсе;

Consistency – согласованность: все данные после выполнения транзакции должны находиться в согласованном состоянии с соблюдением всех правил и ограничений целостности;

Isolation – изолированность: изменения данных, выполняемых различными одновременно работающими транзакциями, должны быть изолированы;

Durability – долговечность: после завершения транзакции ничто не может вернуть систему в состояние, в котором она была до начала транзакции (происходит фиксация транзакции).

Транзакции должны как можно меньше включать команд и изменять минимум данных. Соблюдение этого требования позволит наиболее эффективным образом обеспечить одновременную работу с данными множества пользователей системы SQL Server 2000. Они определяются на уровне соединения с сервером. Поэтому при закрытии соединения происходит откат невыполненной транзакции, и ее нельзя выполнить позже после восстановления соединения.

SQL Server 2000 поддерживает три вида определений транзакций: явное,

автоматическое и подразумеваемое.

Для управления явными транзакциями применяют команды:

BEGIN TRANSACTION [Имя транзакции] – начало транзакции;

COMMIT TRANSACTION [Имя транзакции] – конец транзакции; ROLLBACK TRANSACTION[Имя транзакции] – откат транзакции;

В последних двух командах слово TRANSACTION можно либо опускать, либо заменять словом WORK. Во всех трех командах допускается использование сокращения TRAN вместо слова TRANSACTION и переменной строкового типа, которой присваивается имя транзакции, вместо непосредственного указания этого имени. Дополнительный аргумент WITH MARK

‘Описание’ позволяет специальным образом маркировать транзакцию в журнале транзакций, что используется при восстановлении базы данных.

Если команды явного определения транзакций не используются, то сервер работает в одном из двух режимов:

а) в режиме автоматического начала транзакций, в котором каждая рассматривается как отдельная транзакция, при этом если команда выполнена успешно, то сделанные ей изменения фиксируются, и выполняется следующая команда, в противном случае производится откат транзакции и выполнение команды повторяется;

б) в режиме неявного начала транзакции, когда начала транзакции не указывается, а ее завершение задается явно командой COMMIT или инициируется командами: ALTER TABLE, CREATE, DELETE, DROP, FETCH, GRANT, INSERT, OPEN, REVOKE, SELECT, TRANCATE TABLE и UPDATE; в этом режиме можно использовать команды COMMIT и ROLLBACK; после завершения текущей транзакции, начинается выполнение следующей, если не был задан откат транзакции.

Режим автоматического начала транзакций устанавливается по умолчанию или командой

SET IMPLICIT – TRANSACTION OFF

Режим неявного (или подразумевающегося) начала транзакций задается только командой

SET IMPLICIT – TRANSACTION ON.

Когда в запросах используются разные базы данных, даже если они расположены на одном физическом сервере, необходимо использовать распределенные транзакции, которые на самом деле представляют собой несколько отдельных транзакций, выполняемых локально в каждой базе данных, используемой в запросе. Если при этом одна из локальных транзакций не выполняется, то происходит откат распределенной транзакции.

Для управления распределенными транзакциями в MS SQL Server 2000 используется координатор DTC (Distribution Transaction Coordinator), удовлетворяющий спецификации “X/ OPUN XA for Distributed Transaction Processing”. Координатор MS DTC начинает и заканчивает локальные транзакции, а также откатывает их назад, если одна из них закончилась с ошибкой. При выполнении распределенных транзакций пользователь может обращаться не только к серверам SQL Server 2000, но и к другим источникам данных: Oracle, Access, источники ODBC и другие.

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

Распределенная транзакция может быть начата несколькими способами.

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

2. Если приложение начинает локальную транзакцию и из нее вызывает удаленную хранимую процедуру при установленном параметре REMOTE_PROC_TRANSACTION, то эта транзакция автоматически расширяется до распределенной транзакции (см.sp_configure).

3. Приложение может начать распределенную транзакцию, используя методы OLE DB

или ODBC.

4. Сервер начинает выполнение распределенной транзакции, если встречает команду

BEGIN DISTRIBUTED TRANSACTION Имя транзакции.

В этом случае для завершения и отката транзакций используются команды COMMIT TRANSACTION и ROLLBACK TRANSACTION.

При работе с явными транзакциями можно использовать вложенные транзакции, выполнение которых инициируется из тела уже активной транзакции. Для управления вложенными транзакциями используются те же команды, при этом каждая команда COMMIT работает только с последней начатой транзакцией. Если в команде ROLLBACK не задано имя транзакции, то откатываются все вложенные транзакции и транзакция самого высокого уровня. Если же имеется необходимость откатить лишь часть транзакций, то предварительно надо создать точку сохранения с помощью команды SAVE TRANSACTION, которую следует указывать при откате. Функция @@TRANSACTION предназначена для определения количества активных транзакций, начатых в активном соединении.

Во всех транзакциях нельзя использовать следующие команды: ALTER DATABASE, BACKUP LOG, CREATE DATABASE, DISK INIT, DROP DATABASE, DUMP TRANSACTION, LOAD DATABASE, LOAD TRANSACTION, RECONFIGURE, RESTORE DATABASE, RESTORE LOG, UPDATE STATISTICS, а также системной хранимой процедуры sp_droption и любой другой хранимой процедуры, изменяющей значения в системной базе master. Для отката таких действий необходимо использовать архивирование базы данных и последующее ее восстановление.

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

Задание 1. Проверить режимы автоматического начала транзакций и неявного начала транзакций, используя переключатель IMPLICIT_TRANSACTION и команду COMMIT.

Задание 2. Создать несколькими способами распределенные транзакции и убедиться в корректности их выполнения.

Задание 3. Создать вложенные транзакции, выполнив следующие команды: CREATE TABLE #aaa (cola int) -- 0-й уровень

BEGIN TRAN -- 1-й уровень

INSERT INTO #aaaVALUES (111)

BEGIN TRAN -- 2-й уровень

INSERT INTO #aaaVALUES (222)

BEGIN TRAN -- 3-й уровень

INSERT INTO #aaaVALUES (333) SELECT * FROM #aaa

SELECT ‘Вложенность транзкций’, @@TRANCOUNT ROLLBACK TRAN

SELECT * FROM #aaa -- откат на 0-й уровень SELECT ‘Вложенность транзакций’, @@TRANCOUNT Проанализировать полученные результаты.

Задание 4. Написать пример пакета запросов с использованием команд COMMIT и

ROLLBACK для автоматических, неявных и явных транзакций.

Задание 5. Написать пример пакета команд, иллюстрирующих использование средств оптимизации при откате транзакций.

Задание 6. Используя средства MS SQL Server 2000, изучить физическую и логическую архитектуру журнала транзакций.

Задание 7. С помощью системной хранимой процедуры sp_configure изменить интервал контрольных точек для базы данных Pubs.

Задание 8. Уточнить синтаксис команд управления транзакциями и написать пример пакета с использованием всех вариантов этих команд.

Лабораторная работа №14

Управление и мониторинг блокировок

Цель работы – изучение проблем надежности, возникающих в многопользовательских средах обработки данных, и механизмов блокирования операций различного типа и уровня, начиная с отдельной строки таблицы и заканчивая базой данных в целом, которые используются в MS SQL Server 2000 для успешного выполнения транзакций, а также для приобретения навыков управления блокировками в запросе и текущими блокировками с помощью Enterprise Manager, обеспечивающего их мониторинг.

В многопользовательских средах обработки данных при одновременном чтении и изменении одних и тех же данных несколькими пользователями могут возникнуть следующие четыре проблемы одновременного доступа:

The Lost Update Problem – проблема последнего изменения, заключающаяся в том, что если несколько пользователей будут одновременно изменять одни и те же данные, то сохраняться изменения того пользователя, который запишет их последним; для решения этой проблемы надо обеспечить последовательное внесение изменений.

The Uncommitted Dependency Problem – проблема грязного чтения, когда пользователь считывает данные, обработка которых еще не завершена другим пользователем; для ее решения необходимо ожидание окончания всех изменений данных.

The Inconsistent Analysis Problem – проблема не повторяемого чтения, когда требуется многократное чтение одних и тех же данных, а они изменяются в это время другим пользователем; для ее решения необходим запрет на изменение таких данных другими пользователями.

The Phantom Read Problem – проблема чтения фантомов, когда один пользователь выбирает данные из таблицы, а второй пользователь вставляет новые строки; здесь также необходим запрет на изменение данных вторым пользователем.

Временно накладываемые ограничения на выполнение некоторых операций обработки данных называются блокировками (locks). Специальный стандарт ANSI поддерживает четыре уровня блокировок, при этом каждый последующий уровень поддерживает требования предыдущего и налагает дополнительные ограничения:

Уровень 0 – запрещение загрязнения данных; для выполнения этого требования надо, чтобы изменения проводил лишь один пользователь, а остальные ожидали окончания этого изменения.

Уровень 1 – запрещение грязного чтения: если один пользователь начал изменение данных, то другие пользователи не должны читать эти данные до окончания их изменения.

Уровень 2 – запрещение неповторяемого чтения: если пользователь считывает данные, то никакой другой пользователь не сможет их изменить.

Уровень 3 – запрещение фантомов: если пользователь работает с данными, то никакой другой пользователь не должен добавлять новые или удалять имеющиеся строки.

MS SQL Server 2000 поддерживает все четыре уровня блокировок. Управлением блокировками занимается менеджер блокировок (lock manager), контролирующий их наложение и разрешение конфликтов. Блокировки и транзакции тесно связаны друг с другом. Транзакции накладывают блокировки на данные, чтобы обеспечить выполнение требований ASID, так что

пользователю чаще всего не нужно предпринимать никаких действий по управлению блокировками. Однако при необходимости в запросе можно явно указать, какой тип блокировки надо использовать в том или ином случае. Команда SET LOCK_TIMEOUT позволяет регулировать время ожидания разблокирования ресурса, по истечении которого выдается ошибка. Системная хранимая процедура sp_configure ‘locks’, n устанавливает максимальное количество блокировок в системе.

SQL Server 2000 поддерживает различные уровни блокирования объектов, начиная с отдельной строки и заканчивая базой данных в целом:

RID – на уровне строки таблицы при вставке новых строк;

Key – на уровне индекса, когда блокируется его часть, соответствующая изменяемым в транзакции данным;

Page – на уровне страницы; Extent – на уровне экстента; Table – на уровне таблицы; DB – на уровне базы данных.

Основной единицей блокирования является страница, а минимальным элементом – строка. Сервер может динамически управлять уровнем блокирования для конкретной транзакции в зависимости от характера запросов.

Для транзакции SQL Server 2000 может устанавливать различные уровни изоляции, чтобы делать их независимыми друг от друга. Эти уровни соответствуют рассмотренными уровням стандарта ANSI и решают четыре проблемы одновременного доступа:

READ UNCOMMITED – незавершенное чтение: гарантируется только физическая целостность данных;

READ COMMITED – завершенное чтение: не возникает проблемы грязного чтения;

REPEATABLE READ – повторяющееся чтение: помимо решения проблемы грязного чтения решается проблема неповторяемого чтения;

SERIALIZABLE сериализуемость: обеспечивает полную изоляцию транзакций друг от

друга.

Установка уровня изоляции транзакций устанавливается командой SET TRANSACTION ISOLATION LEVEL.

В зависимости от выполняемых над данными действий SQL Server обеспечивает четыре типа блокировок:

S (Shared) – коллективная блокировка при чтении данных несколькими пользователями;

V (Update) – блокировка обновления как подготовительная для перехода от коллективной к монопольной блокировке;

E (Exclusive) – монопольная блокировка, если транзакция изменяет данные;

BU (Bulk update) – блокировка массового обновлении при выполнении операций массового копирования в таблицу.

Помимо основных типов блокировок SQL Server 2000 поддерживает ряд специальных блокировок, предназначенных для повышения производительности и функциональности обработки данных. Блокировки этого типа называются блокировками намерения (intent locks). Они используются сервером в том случае, если транзакция намеривается получить доступ к данным вниз по иерархии и необходимо запретить другим транзакциям накладывать блокировки, которые будут конфликтовать с блокировкой, накладываемой первой транзакцией.

Помимо рассмотренных блокировок на данные SQL Server 2000 использует несколько блокировок на метаданные, описывающие структуру объектов. Такими блокировками являются блокировка схемы и блокировка диапазона ключа.

При работе многопользовательской системы возможны ситуации, когда две транзакции блокируют два блока данных и для завершения работы каждой из транзакций необходим доступ к данным, заблокированным ранее другой транзакцией. Это так называемые “мертвые”, или

тупиковые (deadlocks) блокировки. Для избежания подобных проблем имеется специальный механизм разрешения конфликтов тупикового блокирования. Кроме того для минимизации возможности их образования необходимо соблюдать ряд правил при разработке кода транзакции: минимизировать длительность транзакции, использовать низкий уровень изоляции, избегать в транзакции взаимодействия с пользователем и т.д.

В командах SELECT, DELETE, UPDATE и INSERT можно с помощью специальных ключевых слов, или хинтов (hint) управлять блокировками и уровнем изоляции:

HOLDLOCK – для удержания коллективной блокировки до конца транзакции;

NOLOCK – разрешает грязное чтение; PAGLOCK – блокировка на уровне страницы; READCOMMITTED – установка первого уровня изоляции; ROWLOCK – блокировка на уровне строки; SERIALIZABLE – установка высшего уровня изоляции; TABLOCK – блокировка на уровне таблицы;

TABLOCKX – блокировка на уровне таблицы до завершения транзакции.

Имеются и другие хинты.

Задание 1. Создать несколько одновременно работающих процессов, соединенным с одним и тем же сервером и использующих одни и те же базы данных, и с помощью утилиты Enterprise Manager произвести мониторинг текущих блокировок сервера, используя следующие его папки:

Management/Current Activity/Process Info – папка с подробной информацией обо всех процессах, которые в текущий момент обращаются к серверу;

Management/Current Activity/Locks/Process ID – папка с информацией о текущих блокировках, которые установлены процессами;

Management/Current Activity/Locks/Object – папка с информацией об объектах, которые блокированы в текущий момент процессами.

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

В папке Process Info содержится следующая информация: Process ID – идентификационный номер процесса;

User – имя учетной записи пользователя;

Database – имя используемой процессом базы данных;

Status – состояние процесса: работает в основном режиме (Runable), работает в фоновом режиме (Background) или бездействует (Sleeping);

Open Transaction – количество транзакций, открытых процессов; Command – последняя выполненная команда;

Application – имя приложения, установившего соединение; Wait time – время ожидания разблокирования ресурса;

Wait type – тип ожидания разблокирования ресурса; Wait resource – имя ожидаемого ресурса;

CPU time – время работы процесса;

Physical ID – физический идентификатор процесса; Memory Usage – объем памяти, занятой процессом; Login time – время регистрации процесса;

Last Batch – время выполнения процессом последней команды; Host – имя компьютера, на котором был запущен процесс;

Network Library – имя сетевой библиотеки соединения с процессом;

Network Address – адрес сетевой карты, которую использовал процесс для установления соединения;

Blocked by – количество процессов, блокируемых данным процессом;

Blocking – количество процессов, блокирующих выполнение данного процесса.

В папках Locks/Process ID и Locks/Object содержится одна и та же информация,

сгруппированная соответственно по процессам и по объектам:

Process ID – идентификационный номер процесса; Object – имя блокированного объекта;

Lock Type – тип блокировки: базы данных (DB), таблица (TAB), экстент (EXT), страница

(PAG), диапазон ключа (KEY) и строка (RID); Mode – вид блокировки:

S – коллективная блокировка; V – блокировка обновления;

X – монопольная блокировка;

IS, IX, SIX – блокировки намерения; Sch-C, Sch-M – блокировки схемы;

BV – блокировка массового обновления; Status – статус блокировки:

GRANT – блокировка установлена и успешно работает;

WAIT – блокировка ожидает ресурса;

CNVT – выполняется конвертирование блокировки;

Owner – владелец блокировки: Sess – сессия, Xact – транзакция, Curs – курсор; Index – имя индекса, связанного с ресурсом;

Resource – идентификатор заблокированного ресурса.

Задание 2. Используя системные хранимые процедуры sp_lock, sp_who и команды Transact – SQL DBCC OPENTRANT, DB_ID, произвести мониторинг текущих блокировок сервера. Описание процедур и команд найти в документации.