Параллельный доступ - это ситуация, возникающая когда несколько транзакций обращаются к одним данным одновременно.
Проблема доступа в том, что необходима полная изолированность пользователей.
Изолированность - это создание иллюзии, что каждый пользователь работает с БД самостоятельно.
3 уровня изолированности пользователей:
-
- Отсутствие потерянных изменений
Транзакция1 |
Транзакция2 |
READ A A=A+1 WRITE A COMMIT |
READ A A=A+1 ROLLBACK |
ROLLBACK из второй транзакции откатит и изменения, сделанный первой транзакцией.
До завершения транзакции1 нельзя менять объект, с которым работает транзакция
-
- Отсутствие чтения “грязных” данных
Транзакция1 |
Транзакция2 |
READ A A=A+1 WRITE A ROLLBACK |
. . . . . . . . . READ A A=A-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 |
Если приоритет второй транзакции мал, то она ждать будет долго.
Решения:
- Динамические приоритеты (чем дольше ждет, тем выше приоритет)
- Ранжирование очередей (несколько очередей, в каждой транзакции одного приоритета. очереди обходятся по-порядку, из них по очереди достаются транзакции.
2. Тупики (DeadLock)
Транзакция1 |
Транзакция2 |
LOCK A . . . LOCK B . . . . . . |
LOCK B . . . LOCK A . . . . . . |
Дойдя до этого места, транзакции войдут в тупик, ожидая друг друга.
Способы обнаружения тупиков:
- Контроль времени ожидания
- Построение графа ожиданий.
При обнаружении подобной структуры выбирается транзакция с наименьшим приоритетом и она снимается.
Способы предупреждения тупиков:
- упорядочить ресурсы БД и захватывать их в заданном порядке.
- захватывать в транзакции сразу все объекты.
Двухфазный протокол:
Все операции LOCK должны предшествовать операциям UNLOCK.
Транзакция1 |
Транзакция2 |
LOCK A LOCK B ….. LOCK C ….. UNLOCK A ….. |
LOCK C ….. UNLOCK C …… …… LOCK A UNLOCK A |
Метод временных меток.
Транзакция, обращаясь к объекту, ставит флаг, указывающий время обращения к объекту и операцию. Если флаг уже есть, а операции конфликтуют, то более старая транзакция снимается.