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

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

Изолированность - это создание иллюзии, что каждый пользователь работает с БД самостоятельно.

3 уровня изолированности пользователей:

    1. Отсутствие потерянных изменений

Транзакция1

Транзакция2

READ A

A=A+1

WRITE A

COMMIT

READ A

A=A+1

ROLLBACK

ROLLBACK из второй транзакции откатит и изменения, сделанный первой транзакцией.
До завершения транзакции1 нельзя менять объект, с которым работает транзакция

    1. Отсутствие чтения “грязных” данных

Транзакция1

Транзакция2

READ A

A=A+1

WRITE A

ROLLBACK

. . .

. . .

. . .

READ A

A=A-1

Никакая транзакция не должна читать объект до завершения изменений.

    1. Отсутствие неповторяющихся чтений

Транзакция1

Транзакция2

READ A

A=A+1

WRITE A

READ A

A=A-1

. . .

WRITE A

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

Блокировки.

Блокировка- запрет на доступ к ресурсу. Заблокировать можно поле, кортеж, отношение, группу отношений или всю базу данных.
LOCK A - заблокировать ресурс А
UNLOCK A - разблокировать ресурс А

Совместимость блокировок.

запись объекта

Чтение объекта

запись части объекта

чтение части объекта

чтение/запись части объекта

запись объекта

нет

Нет

нет

нет

Нет

чтение объекта

нет

Да

нет

да

Нет

запись части объекта

нет

Нет

да

да

Да

чтение части объекта

нет

Да

нет

да

Да

чтение/запись части объекта

нет

Нет

нет

да

Нет

Проблемы, вызванные блокировками

1. “Бесконечное ожидание

Транзакция1

Транзакция2

Транзакция3

LOCK A

. . .

. . .

UNLOCK A

. . .

LOCK A

. . .

. . .

. . .

LOCK A

. . .

. . .

. . .

LOCK A

. . .

UNLOCK A

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

Решения:

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

2. Тупики (DeadLock)

Транзакция1

Транзакция2

LOCK A

. . .

LOCK B

. . .

. . .

LOCK B

. . .

LOCK A

. . .

. . .

Дойдя до этого места, транзакции войдут в тупик, ожидая друг друга.

Способы обнаружения тупиков:

  1. Контроль времени ожидания
  2. Построение графа ожиданий.

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

Способы предупреждения тупиков:

  1. упорядочить ресурсы БД и захватывать их в заданном порядке.
  2. захватывать в транзакции сразу все объекты.

Двухфазный протокол:

Все операции LOCK должны предшествовать операциям UNLOCK.

Транзакция1

Транзакция2

LOCK A

LOCK B

…..

LOCK C

…..

UNLOCK A

…..

LOCK C

…..

UNLOCK C

……

……

LOCK A

UNLOCK A

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

Транзакция, обращаясь к объекту, ставит флаг, указывающий время обращения к объекту и операцию. Если флаг уже есть, а операции конфликтуют, то более старая транзакция снимается.