Автор работы: Пользователь скрыл имя, 19 Ноября 2009 в 17:56, Не определен
Контрольная работа
Тип блокировки
shared
update
exclusive
shared
OK
OK
X
update
OK
X
X
exclusive
X
X
X
Таблица 3.
Уровень блокировки
может распространяться на:
• запись (для
операций insert);
• cтраницу - 2-килобайтный
фрагмент данных или индексов;
• расширение (extent)
- 8 последовательных страниц, используется
при размещении или высвобождении
страниц (например, в командах create/drop
или когда операция вставки insert требует
выделения новых страниц памяти);
• таблицу, включая
все входящие в нее данные и
индексы[2].
В следующей
версии блокировка уровня записи будет
возможна для всех типов транзакций.
Блокировка уровня записи на операции
вставки позволяет в первую очередь
решить задачу уменьшения вероятности
конкуренции в OLTP-системах с массированным
одновременным вводом информации (типичный
пример - операционный день банка), где
таблицы содержат только некластерные
индексы или кластерный индекс построен
по монотонно возрастающему ключу. По
умолчанию эта опция выключена. В текущей
базе данных ее можно задействовать командой
sp_tableoption <Имя таблицы или шаблон>, 'insert
row lock', 'true'.
Существует диалектическое
противоречие, с которым наверняка
сталкивался каждый администратор
базы данных или разработчик. С одной стороны,
хочется уменьшить до минимума вероятность
столкновения интересов пользователей
при доступе к одним и тем же ресурсам
и потому блокировать все на как можно
более детальном уровне. С другой - очень
не хочется перегружать менеджер блокировок,
который фиксирует информацию о том, кто
наложил блокировку, какого типа, кто ждет,
пока она освободится и т. д. Например,
в MS SQL Server 6.5 каждая блокировка обходится
в 32 байта. Для разрешения этого противоречия
сервер умеет автоматически повышать
уровень блокировки в случае, если блокировок
предыдущего уровня детализации становится
слишком много (lock escalation). "Слишком много"
- это LE Threshold Maximum в настройках конфигурации
сервера, т. е. максимальная пороговая
величина числа страничных блокировок,
при достижении которой происходит эскалация
до уровня таблицы. По умолчанию она равна
200. Для этих же целей используется настройка
LE Threshold Percentage - в относительном выражении
к размеру таблицы (но не меньше, чем LE
Threshold Minimum, что полезно для небольших таблиц).
В перспективе возможна обратная стратегия
динамической деэскалации уровня блокировки,
когда блокируется заведомо больший фрагмент
данных, чем требуется, но, как только появляется
транзакция, конкурирующая за данные внутри
данного фрагмента, уровень первой транзакции
будет автоматически уменьшен.
Управление уровнем
изоляции транзакций на протяжении всего
соединения (пользовательской сессии)
осуществляется при помощи установки
set transaction isolation level <уровень изоляции>,
где уровень изоляции может принимать
значения:
read uncommitted соответствует
уровню изоляции 0 стандарта ANSI, т.
е. просто запрещает различным
транзакциям изменять одни и
те же данные в одно и
то же время, но допускает
грязное и неповторяющееся чтение
и фантомы[3];
read committed (устанавливается
по умолчанию) соответствует
repeatable read или
serializable соответствует уровню 3 по
стандарту ANSI - предотвращает грязное
чтение, а также гарантирует, что два оператора
select в разных местах одной транзакции
будут возвращать одинаковый результат,
т. е. исключает неповторяющееся чтение
и фантомы.
Последний, самый
надежный уровень защиты транзакций
является самым неоптимальным с точки
зрения быстродействия, так как за все
приходится платить. Для более гибкого
управления уровнем изоляции для каждого
оператора select может явно задаваться опция
настройки;
nolock то же, что
read uncommitted, - дает возможность чтения
грязных (еще не зафиксированных) данных,
которая перекрывает аналогичные параметры
конфигурации пользовательской сессии.
В операторе select можно также оговорить
продолжительность блокировки данных;
holdlock инструктирует
сервер держать блокировки до
завершения транзакции (по умолчанию
блокировки снимаются сразу же по прочтении
требуемых данных;
Тип и уровень
блокировки:
updlock заставляет
применить блокировку update вместо
обычной shared, используется, когда
следом идет оператор update, основанный
на прочитанных значениях, чтобы запретить
update из других транзакций;
paglock заставляет
сервер при любых условиях
использовать блокировки
tablock принудительно
блокирует таблицу (shared);
tablockx принудительно
блокирует таблицу (exclusive).
Просмотр текущих блокировок выполняется при помощи хранимой процедуры sp_lock или через включение флага трассировки 1200 на клиента: dbcc traceon (3604,1200). Также полезным являются флаги 1204 и 1205, которые выдают информацию о cитуациях взаимной блокировки (deadlocks). MS SQL Server обладает возможностью автоматического обнаружения deadlocks как циклов в цепочке блокировок. Он находит первый процесс, который мог бы разорвать цикл, убивает его и откатывает все транзакции этого процесса, находившиеся в стадии выполнения. Как правило, им оказывается тот самый процесс, который запросил блокировку, послужившую причиной зацикливания. После этого сервер генерирует сообщение об ошибке 1205. Если клиентское приложение имеет обработчик ошибок, отлавливающий ошибку 1205, то оно может предпринять соответствующие действия по исправлению ситуации, и конечный пользователь, скорее всего, даже не узнает, что имела место взаимная блокировка.
Надежность хранения
информации
В критических
для бизнеса приложениях, когда
сервер СУБД должен быть постоянно доступен
для клиентов, большинство профилактических
работ по поддержке базы данных приходится
выполнять фактически в режиме on-line. MS
SQL Server обладает возможностями динамического
резервного копирования данных, т. е. даже
когда эти данные используются и изменяются
клиентами. В случае сбоя оборудования,
отключения питания и т. д. механизм автоматического
восстановления MS SQL Server восстанавливает
все базы данных до их последнего целостного
состояния без вмешательства администратора.
Все завершенные, но не отраженные в базе
транзакции из журнала транзакций применяются
к базе данных (это фактически то, что происходит
при событии chekpoint), а незавершенные транзакции,
т. е. те, которые были активными на момент
сбоя , вычищаются из журнала.
Как мы уже отмечали,
говоря о симметричной архитектуре,
операции резервного копирования и
восстановления могут распараллеливаться
на несколько потоков и
DECLARE @tomorrow char(8)
SELECT @tomorrow = CONVERT(char(8),
DATEADD(dd, 1, GETDATE()) , 1)
DUMP DATABASE pubs
TO DISK = 'ntalexeyshdisk_dsql_
WITH INIT, EXPIREDATE=@tomorrow,
STATS
Для небольшой
базы данных ее журнал транзакций обычно
хранится на том же устройстве, что
и сама база, и архивируется вместе
с ней. Журналирование транзакций ведется
по принципу write-ahead, что означает, что
любое изменение сначала отражается
в журнале транзакций и лишь потом попадает
собственно в базу. В случае нахождения
журнала транзакций на отдельном устройстве
существует возможность отдельного резервного
копирования журнала транзакций. Как правило,
резервное копирование базы данных организуется
с меньшей частотой, чем журнала транзакций.
Например, сохранение журнала транзакций
выполняется ежедневно, а страховая копия
всей базы может делаться раз в неделю,
так как архивирование журнала транзакций
происходит значительно быстрее по времени
и занимает меньше места, чем дамп целой
базы. В отличие от резервирования базы
данных дамп журнала транзакций очищает
его неактивную часть, т. е. все завершившиеся
(зафиксированные или абортированные)
с момента последнего дампа транзакции,
если только не использована опция NO_TRUNCATE.
Команда DUMP TRANSACTION TRUNCATE_ONLY, очищающая журнал
транзакций, полезна в случае его переполнения,
которое можно контролировать, например,
оператором DBCC SQLPERF (LOGSPACE). Если степень
переполнения журнала очень высока, можно
при его очистке отказаться от журналирования
факта самого этого события: DUMP TRANSACTION
NO_LOG. Если резервное копирование транзакций
не представляет интереса, можно включить
опцию очистки последних завершенных
транзакций в базе по наступлению события
checkpoint. Cмысл механизма checkpoint состоит в
периодической записи данных из кэша на
диск, чтобы не допускать грязных данных.
Такого рода события постоянно генерируются
MS SQL Server или возникают по инициативе пользователя.
Включенная опция truncate log on checkpoint гарантирует
выполнение с определенной частотой обработчиком
события действий, приблизительно эквивалентных
команде DUMP TRANSACTION TRUNCATE_ONLY.
При восстановлении
журнала транзакций соответствующие
транзакции применяются к базе данных.
Это означает, что если в начале недели
была сделана резервная копия всей базы,
а потом ежедневно архивировались транзакции
за каждый день, то при необходимости восстановления
поднимается состояние базы на начало
недели и на него последовательно накатываются
дампы журнала транзакций за все дни, предшествующие
моменту восстановления. MS SQL Server 6.5 имеет
возможность восстановления данных из
журнала транзакций на произвольный момент
времени (разумеется, отраженный в журнале)
при помощи команды LOAD TRANSACTION STOPAT <t>
или в окне database backup and restore выбором опции
until time. Все содержащиеся в этом дампе транзакции,
отмеченные завершившимися после этого
момента, будут откачены.
Возможность планирования
задач резервного копирования во времени
и отсылки сообщений по e-mail в случае успешного/неуспешного
завершения рассматривалась нами при
обсуждении SQL Executive.
MS SQL Server 6.5 предусматривает
возможность зеркалирования
Transfer Manager используется для экспорта/импорта объектов и данных БД на MS SQL Server между разными аппаратными платформами, например между процессорами Intel и Alpha, а также между разными версиями MS SQL Server, в частности из более ранних в более поздние или между равноценными (имеются в виду 4.х и 6.х). Очень часто проектирование объектов базы ведется с помощью различных графических средств, но проектная документация может требовать структуру объектов с точностью до операторов DDL. Для получения скриптов, описывающих создание отдельного объекта базы данных, можно использовать команду transfer из контекстного меню объекта или выбрать соответствующий класс и имя объекта в Transfer Manager. Кроме этого, содержимое данных может быть выгружено/загружено при помощи утилиты bcp (см. табл. 1).
Тиражирование
Наличие развитого
механизма тиражирования в любой
серьезной системе управления базами
данных обуславливается необходимостью
приближения данных к местам их непосредственного
потребления, что является особенно важным
фактором при построении витрин данных
в системах принятия решений, разгрузки
приложений от избыточных функций чтения/поиска
при создании отчетов и т. д. Создание распределенных
приложений с использованием средств
тиражирования положительно сказывается
на относительной автономии сайтов, повышении
масштабируемости и производительности.
Традиционно в построении распределенных
систем данных существуют два основных
подхода. Один из них основан на плотной
целостности данных (loose consistency) и рассматривался
нами в пункте, посвященном MS Distributed Transaction
Coordinator. Протокол двухфазной фиксации
гарантирует идентичность данных в любой
момент времени на всех узлах сети, однако
необходимо иметь в виду, что этот подход
требует наличия высокоскоростных каналов
передачи данных и постоянной доступности
каждого узла. Другой подход, основанный
на слабой целостности (loose consistency), допускает,
вообще говоря, некоторый временной интервал
между внесением изменений в оригинал
и их отражением в образе. Приложения,
основанные на принципе слабой целостности,
являются значительно менее чувствительными
к доступности узлов, а также пропускной
способности и надежности каналов передачи
данных. Тиражирование в MS SQL Server построено
на использовании именно второго подхода.
Основными действующими
лицами в процессе тиражирования
служат издатель (publisher), дистрибьютор
(distributor) и подписчик (subscriber). Поскольку
тиражирование является неотъемлемой
составной частью MS SQL Server, последний может
выступать в роли каждого из них. Конфигурирование
и управление каждой ролью осуществляется
из SQL Enterprise Manager через уже знакомые нам
SQL-DMO или с помощью операторов и хранимых
процедур языка Transact-SQL. Репликационной
единицей в плане распространения и подписки
является публикация (publication). Публикация
состоит из одной или нескольких статей
(articles). Статьей публикации называется
отдельная таблица или ее вертикальный
и/или горизонтальный фрагмент. Вертикальное
фрагментирование осуществляется выбором
соответствующих полей таблицы, горизонтальное
- при помощи условия where или специальной
процедуры горизонтальной фильтрации
(CREATE PROCEDURE - FOR REPLICATION). Таблица обязана
иметь первичный ключ. Как только на издателе
созданы статьи, все тиражируемые объекты
отмечаются специальным признаком в одном
из полей системной таблицы sysobjects. Кроме
этого, в тиражируемой базе ведется еще
три справочные таблицы. Syspublications в отдельной
строке хранит информацию о каждой новой
публикации. Она связана отношением один-ко-многим
с таблицей sysarticles, содержащей информацию
о статьях и их принадлежностью публикациям.
Наконец, последняя, в свою очередь, связана
отношением один-ко-многим с таблицей
syssubscriptions, где содержится информация о
том, каким подписчикам адресована каждая
статья.