Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
36
Добавлен:
26.05.2015
Размер:
83.97 Кб
Скачать
  1. Управление транзакциями

Одной из основных проблем многопользовательских СУБД является организация одновременного доступа к одним и тем же данным множества пользователей с помощью механизма транзакций. Они кратко могут быть определены как: потеря изменений, незафиксированные изменения и ряд других, более сложных проблем.

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

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

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

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

Стандарт ANSI предусматривает четыре уровня изолированности транзакций:

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

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

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

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

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

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITED

READ COMMITED

REPEATABLE READ

SERILIZABLE }

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

SET XACT_ABORT ON

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

Чем выше уровень изолированности, тем меньше возможностей для параллельного выполнения транзакций. Основным механизмом достижения изолированности является механизм блокировок. Транзакция запрашивает захват объекта в одном из режимов: совместный (S - Shared) или монопольный (X - eXclusive). Для реляционных БД объектами захвата могут быть

  • файл: несколько отношений с индексами;

  • отношение;

  • страница данных: несколько кортежей, индексная страница;

  • запись;

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

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

Соседние файлы в папке SQL_server