Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Уд.DOC
Скачиваний:
7
Добавлен:
27.10.2018
Размер:
1.11 Mб
Скачать

13. Организация многопользовательского доступа

1. Организация параллельного доступа.

2. Разделение прав доступа.

Организация параллельного доступа.

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

Изолированность – состояние работы, при котором пользователь не ощущает присутствия других лиц.

Основные варианты нарушений:

  • потеря изменений:

Т1

Т2

Состояние

ЧтА

А0

ЧтА

А0

ИзмА

А1

ИзмА

А2

[откат]

[А0]

ЧтА

А2 [А0]

Решение – запрет изменения данных, измененных другой транзакцией, до завершения этой транзакции.

  • чтение грязных данных:

Т1

Т2

Состояние

ЧтА

А0 B0

ЧтВ

B0 A0

ИзмА

А1 B0 – грязные данные

ЧтА

A1 B0

ЧтВ

A1 B0

ИзмВ

A1 B1

A,B – связанные данные. Так мы прочитаем неверные данные. Решение – запрет чтения данных, изменяемых другой транзакцией до ее завершения.

  • неповторяющееся чтение:

Т1

Т2

Состояние

ЧтА

A0

ЧтА

A0

ИзмА

A1

ЧтА

A1

Нарушение изолированности. Решение – запрет изменения данных, читаемых другой транзакцией до завершения транзакции:

Т1\Т2

W

R

W

а)

б)

R

в)

+

  • фантомная запись:

Т1

Т2

Чт {А}

Доб. в {A}

Чт {B}

{A} – набор данных.

Решение – полная блокировка набора данных, которые читаются.

Указанные 4 ситуации относятся к разным уровням изолированности. В СУБД реализуются 2-а или более уровня изолированности. В стандарте SQL-92 определены 4 уровня:

Запрет Чт

изм-ся

Запрет Изм

чит-ся

Запрет

доб-ия

read uncommitted

-

-

-

read committed

+

-

-

read repeatable

+

+

-

serializable

+

+

+

Реализуется исполнение транзакций с помощью следующих методов:

  1. последовательное исполнение – выполняется только одна транзакция, остальные ждут ее завершения; для ускорения следует разрешить любую работу с различными данными и одновременное чтение одних и тех же данных;

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

    1. 1 фаза – транзакция захватывает данные по мере обращения к ним:

    1. 2 фаза – одновременное освобождение всех данных по завершению транзакции.

При двухфазном протоколе возможна взаимная блокировка:

При наличии тупика, ожидание будет бесконечным, необходимо нестандартное разрешение. Конфликты блокировок решаются следующими методами:

  • полуавтоматический вариант: при обнаружении конфликта – запрос пользователю, пользователь принимает решение – ожидание или откат;

  • автоматический – при обнаружении конфликта после заданного ожидания – автооткат транзакции (первой);

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

Тупику соответствует замкнутый цикл в графе.

Для обнаружения цикла используется редукция графа – поочередно выполняются два шага:

  • удаление дуг от неожидающих транзакций;

  • удаление дуг от свободных данных к транзакциям;

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

При высоком уровне интегрирования – большие затраты на ожидание. Для повышения быстродействия могут использоваться:

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

  • многоверсионная работа:

при записи из какой-либо транзакции, реагируем в соответствии с уровнем изолированности

  • оптимистические методы блокировки – конфликты редки, поэтому блокировку ставим только в момент записи.

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