Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД / УСТАНОВ_ЛЕКЦИИ_БД / УСТАНОВ_ЛЕКЦИИ_БД / 3_Обработка транзакций.ppt
Скачиваний:
47
Добавлен:
26.05.2015
Размер:
161.79 Кб
Скачать

Сервер устанавливает блокировки автоматически в зависимости от текущего уровня изоляции транзакции, однако при желании вы можете изменить тип с помощью специальных подсказок – хинтов. При открытии новой сессии по умолчанию выбирается уровень изоляции READ COMMITTED. Можно изменить этот уровень для данного соединения с помощью команды:

SET TRANSACTION ISOLATION LEVEL

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

База данных (обозначается DB). При наложении блокировки на базу данных блокируются все входящие в нее таблицы.

Таблица (обозначается TAB). При наложении блокировки на таблицу блокируются все экстенты данной таблицы, а также все ее индексы.

Экстент (обозначается EXT). При наложении блокировки на экстент блокируются все страницы, входящие в данный экстент.

Страница (обозначается PAG). При наложении блокировки на страницу блокируются все строки данной страницы.

Строка (обозначается RID).

Диапазон индекса (обозначается KEY). Блокируются на обновление, вставку и удаление данные, соответствующие диапазону индекса.

SQL Server сам выбирает наиболее оптимальный объект для блокировки, однако пользователь может изменить это поведение с помощью команд SQL.

При автоматическом определении объекта блокировки сервер должен выбрать наиболее подходящий с точки зрения производительности и параллельной работы пользователей.

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

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

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

Существует два метода управления конкуренцией для обеспечения параллельной работы множества пользователей – оптимистический и пессимистический. SQL Server использует оптимистическую конкуренцию только при использовании курсоров (cursors). Для обычных запросов на выборку и обновление используется пессимистическая конкуренция.

Блокировки транзакций

На основании X- и S- блокировок может быть основан протокол доступа к данным:

Транзакция, предназначенная для извлечения объекта базы данных, должна осуществить наложение S- блокировки на выбранный объект базы данных.

Транзакция, предназначенная для обновления объекта базы данных, должна осуществить наложение X-блокировки на объект базы данных.

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

X-блокировки не снимаются до конца выполнения транзакции (или до выполнения операторов Commit, Rollback).

Для обеспечения сериализации транзакций синхронизационные захваты объектов, произведенные по инициативе транзакции, можно снимать только после ее завершения (двухфазный протокол синхронизационных захватов Two- Phase Locks, в соответствии с которым выполнение транзакции разбивается на 2 фазы: накопление захватов и освобождение захватов после фиксации или отката).

Механизм блокировок разрешает многопользовательский доступ, однако замедляет выполнение транзакции, что вызвано необходимостью ожидания освобождения занятых данных. Если СУБД реализована таким образом, что может захватывать для выполнения транзакции отдельные записи таблицы, то скорость обработки существенно повысится. Блокировка на уровне записей позволяет достигнуть максимальной производительности за счет того, что объект “запись” является минимальной структурной единицей БД.

“Мертвые блокировки”

Одной из проблем механизма блокирования являются «мертвые блокировки» (DeadLock). При возникновении подобной ситуации две или более транзакций находятся во взаимном ожидании освобождения блокировок, удерживаемых каждой из них. Рассмотрим пример возникновения тупика: пусть транзакции Т1и Т2 установили монопольные захваты, соответственно, объектов А1 и А2, после этого транзакция Т1 требуется совместный захват А2, а транзакции Т2 - совместный захват А1. Ни одна транзакция не может продолжиться, монопольные захваты не смогут быть сняты, следовательно, совместные захваты не будут удовлетворены. Поскольку тупики возможны, и никакого естественного выхода из них не может быть, то необходимо такие ситуации обнаруживать и искусственно устранять. Сервер БД имеет встроенный механизм разрешения этой проблемы:

предупреждение ошибочных ситуаций (СУБД заранее определяет ситуации, в которых транзакции могут вызывать появление этой ошибки, и предотвращает их возникновение, например, установлением порядка выполнения транзакций на основе использования временных меток. В частности, метод «Ожидание-отмена» требует, чтобы новые транзакции ожидали завершения старых; в противном случае, транзакция отменяется и перезапускается с той же самой временной меткой);

выявление взаимных блокировок с последующим их устранением (СУБД допускает появление подобных ситуаций в системе, затем распознает их и организует выход из ситуации. Этот метод более прост в реализации, и поэтому нашел практическое применение. Разрушение тупика начинается с выбора в цикле транзакции - жертвы, чтобы обеспечить возможность продолжения работы других транзакций. Критерием выбора является минимизация стоимости транзакции; стоимость определяется на основе многофакторной оценки, в которую входят с разными весами время выполнения, число накопленных захватов, приоритет. Производится ее откат, что обеспечивает продолжение работы другим транзакциям.

Метод временных меток

При соблюдении двухфазного протокола синхронизации захватов обеспечивается полная сериализация транзакций. Для смягчения требований сериализации транзакций вводится понятие уровня изолированности пользователя.

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

Следующий уровень изолированности называется уровнем подтвержденного чтения. На этом уровне транзакция не имеет доступа к промежуточным или окончательным результатам других транзакций, поэтому пропавшие обновления, промежуточные или несогласованные данные возникнуть не могут. Во время выполнения своей транзакции можно увидеть строку, добавленную в БД другой транзакцией, т.е. сохраняется проблема строк-призраков.

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

Самый низкий уровень изолированности называют уровнем неподтвержденного или «грязного» чтения. При этом уровне изолированности текущая транзакция видит промежуточные и несогласованные данные, и также ей доступны строки-призраки. Однако даже на этом уровне изолированности СУБД предотвращает попавшие обновления.

Четыре уровня изолированности транзакций (стандарт

ANSI)

Read Uncommited. Не допускается обновление данных, пока не закончится первая транзакция, обновляющая эти данные (0-ой уровень изолированности – запрет потерянных и незафиксированных изменений).

Read Commited. Не допускается чтение данных, пока не закончится первая транзакция, обновляющая эти данные (1-ый уровень изолированности нет потерянных и незафиксированных изменений и «грязного чтения»).

Repeatable Read. Не допускается обновление и чтение данных, пока не закончится транзакция, обновляющая эти данные (2-ой уровень изолированности – запрещено неповторяемое чтение).

Serializable. Не допускается обновление и чтение данных, пока не закончится транзакция, обновляющая или читающая эти данные (3-ий уровень изолированности - нет фантомов).

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

{ READ UNCOMMITED

READ COMMITED

REPEATABLE READ

SERILIZABLE }

Автоматический откат транзакции устанавливается командой: SET XACT_ABORT ON

Чем выше уровень изолированности, тем меньше возможностей для параллельного выполнения транзакций.

Уровни определения изоляции транзакций (каждый уровень включает в себя предыдущий с предъявлением более жестких требований к изоляции):

No trashing of data (запрещение «загрязнения» данных). Запрещается изменение одних их тех же данных двумя и более параллельными транзакциями. Изменять данные может только одна транзакция, если какая-то другая транзакция попытается сделать это, она должна быть заблокирована до окончания работы первой транзакции.

No dirty read (запрещение «грязного» чтения). Если данная транзакция изменяет данные, другим транзакциям запрещается читать эти данные до тех пор, пока первая транзакция не завершится.

No nonrepeatable read (запрещение неповторяемого чтения). Если данная транзакция читает данные, запрещается изменять эти данные до тех пор, пока первая транзакция не завершит работу. При этом другие транзакции могут получать доступ на чтение данных.

No phantom (запрещение фантомов). Если данная транзакция производит выборку данных, соответствующих какому-либо логическому условию, другие транзакции не могут ни изменять эти данные, ни вставлять новые данные, которые удовлетворяют тому же логическому условию.

Символы выделения записи

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

Типы запросов, связанных с транзакциями

В свойствах этих запросов можно задать условие использования транзакции при

изменении БД. Установка в значение ДА означает поддержку транзакции при

выполнении запроса.

Параметр блокировка записей определяет,

какие записи будут заблокированы при выполнении транзакции (всех записей или

изменяемой записи). Параметр останов по ошибке позволит выполнить откат.

В MS Access существуют следующие типы запросов по изменению БД

Запрос на создание таблицы

Запрос на удаление записи

Оптимистический метод управления характеризуется тем, что вместо непосредственного чтения данных берется значение из буфера. Никаких блокировок при этом не накладывается. Другие транзакции могут спокойно читать или даже изменять данные. В момент фиксирования транзакции система сравнивает предыдущее (заранее сохраненное) значение данных с текущим. Если они совпадают, выполняются операции блокировки, обновления и разблокировки данных. Если же значения отличаются, то система генерирует ошибку и откатывает транзакцию.

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

Оптимистическая блокировка (Default). В формах два или больше пользователя могут редактировать одну и ту же запись одновременно. Если два пользователя пытаются сохранять изменения в ту же запись, Access отображает сообщение пользователю, который пытается сохранять запись вторым. Этот пользователь может отменить запись, копировать запись в буфер или заменять изменения, сделанные другим пользователем. Эта установка обычно используется для чтения данных или в однопользовательских БД. В сообщениях, записи не заперты тогда как сообщение просмотрено или напечатано. В отчетах записи не блокируются, пока отчет просматривается или печатается. В запросах записи не блокируются пока запись выполняется.