ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 1627
Скачиваний: 25
186
родительский
объект
при
блокировании
дочернего
объекта
.
Например
,
при
намерении
задать
S-
блокировку
кортежа
отношения
,
на
отношение
,
включающее
этот
кортеж
,
вообще
говоря
,
можно
наложить
любую
из
блокировок
типа
IS
,
S
,
IX
,
SIX
,
X
.
При
намерении
задать
Х
-
блокировку
кортежа
,
на
отношение
можно
наложить
любую
из
блокировок
типа
IX
,
SIX
,
X
.
Конкретный
выбор
осуществляется
из
контекста
выполняемой
транзакции
.
Посмотрим
,
как
разрешается
проблема
фиктивных
элементов
(
фантомов
)
с
использованием
протокола
блокировок
по
намерению
при
доступе
к
данным
.
Транзакция
А
дважды
выполняет
выборку
строк
с
одним
и
тем
же
условием
.
Между
выборками
вклинивается
транзакция
В
,
которая
добавляет
новую
строку
,
удовлетворяющую
условию
отбора
.
187
Транзакция
А
Время
Транзакция
В
↓
Блокирует
отношение
IS
-
блокировкой
с
намерением
потом
блокировать
кортежи
t
1
↓
↓
---
Блокирует
S
-
блокировкой
кортежи
,
удовлетворяющие
условию
α
(
заблокировано
n
строк
)
t
2
↓
↓
---
Выборка
кортежей
,
удовлетворяющих
условию
α
(
выбрано
n
строк
)
t
3
↓
---
---
↓
t
43
↓
↓
Попытка
IX-
блокировки
отношения
с
намерением
потом
вставить
кортеж
отвергается
из
-
за
конфликта
с
S
-
блокировкой
транзакции
А
---
t
5
Ожидание
…
↓
Блокирует
S
-
блокировкой
кортежи
,
удовлетворяющие
условию
α
(
заблокировано
n
строк
)
t
6
↓
↓
Ожидание
…
Выборка
кортежей
,
удовлетворяющих
условию
α
(
выбрано
n
строк
)
t
7
↓
Ожидание
…
Фиксация
транзакции
и
снятие
блокировок
t
8
↓
Ожидание
…
---
↓
t
9
↓
Блокирует
отношение
IX-
блокировкой
с
намерением
потом
вставить
кортеж
(
теперь
разрешается
)
---
t
10
↓
Вставка
нового
кортежа
,
удовлетворяющего
условию
а
---
t
11
↓
Фиксация
транзакции
и
снятие
блокировок
↓
Транзакция
А
дважды
корректно
выбирает
n
строк
Все
правильно
Транзакция
В
перед
попыткой
вставить
новую
строку
должна
наложить
на
таблицу
IX
-
блокировку
,
или
более
сильную
(
SIX
и
Х
).
Тогда
транзакция
А
,
для
предотвращения
возможного
конфликта
,
должна
наложить
такую
блокировку
на
таблицу
,
которая
не
позволила
бы
транзакция
В
наложить
IX-
блокировку
.
По
таблице
совместимости
блокировок
определяем
,
что
транзакция
А
должна
наложить
на
таблицу
S
,
или
SIX
,
или
Х
-
блокировку
. (
Блокировки
IS
недостаточно
,
т
.
к
.
эта
блокировка
позволяет
транзакции
В
наложить
IX
–
блокировку
для
последующей
вставки
строк
).
188
Таким
образом
проблема
фиктивных
элементов
(
фантомов
)
решается
,
если
транзакция
А
использует
для
таблицы
S
-
блокировку
по
намерению
или
более
сильную
.
Следует
заметить
,
что
так
как
транзакция
А
собирается
только
читать
строки
таблицы
,
то
минимально
необходимым
условием
в
соответствии
с
протоколом
блокировок
по
намерению
является
преднамеренная
IS
-
блокировка
таблицы
.
Однако
этот
тип
блокировки
не
предотвращает
появление
фантомов
.
Таким
образом
,
пользователь
может
запускать
транзакцию
А
с
разными
уровнями
изолированности
–
предотвращая
или
допуская
появление
фантомов
.
Причем
,
оба
способа
запуска
соответствуют
протоколу
блокировок
по
намерению
для
доступа
к
данным
.
14.8.
Предикатные
синхронизационные
блокировки
Как
было
показано
в
предыдущем
разделе
,
метод
гранулированных
синхронизационных
группировок
с
использованием
захватов
по
намерению
решает
проблему
фантомов
,
только
в
случае
,
если
на
всю
таблицу
накладывается
блокировка
в
режиме
S
или
X
.
Более
слабые
захваты
отношения
не
обеспечивают
ликвидацию
проблемы
фиктивных
элементов
.
Известно
,
однако
,
что
проблема
элементов
-
фантомов
не
будет
возникать
,
если
перейти
от
захватов
индивидуальных
объектов
базы
данных
к
захвату
условий
(
предикатов
),
которым
удовлетворяют
задействуемые
транзакцией
объекты
.
При
использовании
блокировок
на
уровне
отношений
,
проблемы
фиктивных
записей
не
возникает
именно
потому
,
что
отношение
как
логический
объект
представляет
собой
неявное
условие
для
входящих
в
него
кортежей
.
Захват
отношения
представляет
собой
простой
и
частный
случай
так
называемых
предикатных
блокировок
.
Поскольку
любая
операция
над
реляционной
базой
данных
задается
некоторым
условием
(
т
.
е
.
в
ней
указывается
не
конкретный
набор
объектов
базы
данных
,
над
которыми
нужно
выполнить
операцию
,
а
условие
,
которому
должны
удовлетворять
объекты
этого
набора
),
то
удобным
способом
было
бы
S-
или
X
-
блокирование
именно
этого
условия
.
Однако
при
попытке
использовать
этот
метод
в
реальной
СУБД
возникает
трудность
определения
совместимости
различных
условий
.
Действительно
,
в
языке
SQL
допускаются
условия
с
подзапросами
и
другими
сложными
предикатами
.
Поэтому
в
общем
виде
эта
проблема
практически
вряд
ли
разрешима
.
Совместимость
предикатов
сравнительно
легко
определяется
для
случая
простых
условий
,
имеющих
вид
:
189
{
Имя
атрибута
{= |<> | > | >= | < | <=}
Значение
}
[{
OR
|
AND
} {
Имя
атрибута
{= |
<
> | > | >= | < | <=}
Значение
}.,..]
Использование
предикатных
блокировок
решает
проблему
фиктивных
элементов
(
фантомов
),
т
.
к
.
второй
транзакции
не
разрешается
вставлять
новые
строки
,
удовлетворяющие
уже
заблокированному
условию
.
Для
простых
условий
совместимость
предикатных
блокировок
легко
определяется
на
основе
следующей
геометрической
интерпретации
.
Пусть
R
отношение
с
атрибутами
А
1
,
А
2
, …,
A
n
, a
M
1
,
M
2
, …,
M
n
–
множество
допустимых
значений
этих
атрибутов
(
все
эти
множества
конечны
).
Тогда
можно
сопоставить
отношению
R
конечное
n
-
мерное
пространство
возможных
значений
кортежей
отношения
R
.
В
этом
пространстве
любое
простое
условие
(
предикат
) «
вырезает
»
m
-
мерный
(
m
<=
n
) «
прямоугольник
».
Тогда
можно
утверждать
,
что
S-X
,
X-S
,
X-X
предикатные
блокировки
от
разных
транзакций
являются
совместимыми
,
если
соответствующие
предикатам
этих
транзакций
«
прямоугольники
»
не
пересекаются
.
Можно
проиллюстрировать
это
простым
примером
.
Как
видно
из
рисунка
,
в
каких
бы
режимах
транзакция
1
не
требовала
блокировки
условия
(1<=
a
<=4)
&
(
b
=4), a
транзакция
2 –
условия
(1<=
a
<=5)
&
(1<=
b
<=3),
эти
блокировки
будут
всегда
совместимыми
,
так
как
захватывают
различные
множества
записей
.
Пример
: (
n
=2)
(1<=
5 (1<= <=3)
a<= )&
b
(1<= <=4) ( = )
a
& b
4
1
2
3
4
5
1
2
3
4
a
b
Рис
. 14.4.
Иллюстрация
совместимости
предикатных
блокировок
(
при
n=2)
Предикатные
блокировки
простых
условий
описываются
таблицами
,
немногим
отличающимися
от
таблиц
традиционных
синхронизаторов
транзакций
.
190
14.9.
Метод
временных
меток
Еще
один
альтернативный
метод
сериализации
транзакций
,
хорошо
работающий
в
условиях
редких
конфликтов
транзакций
и
не
требующий
построения
графа
ожидания
транзакций
основан
на
использовании
так
называемых
временных
меток
.
Основная
идея
этого
метода
состоит
в
следующем
–
если
транзакция
А
началась
раньше
транзакции
В
,
то
система
обеспечивает
такой
режим
выполнения
,
как
если
бы
А
была
целиком
выполнена
до
начала
В
.
Для
этого
каждой
транзакции
Т
приписывается
временная
метка
t
,
соответствующая
времени
начала
Т
.
При
выполнении
операции
над
объектом
r
базы
данных
транзакция
Т
помечает
его
своей
временной
меткой
и
типом
операции
(
чтение
или
изменение
).
Перед
выполнением
операции
над
объектом
r
транзакция
В
выполняет
следующие
действия
.
•
Смотрит
,
помечен
ли
и
кем
этот
объект
.
•
Проверяет
,
не
закончилась
ли
транзакция
А
,
пометившая
этот
объект
.
Если
А
закончилось
,
В
помечает
объект
r
своей
временной
меткой
и
выполняет
операцию
;
•
Если
транзакция
А
не
завершилась
,
то
В
проверяет
конфликтность
операций
.
Если
операции
неконфликтны
,
при
объекте
r
остается
или
проставляется
временная
метка
с
меньшим
значением
(
более
ранняя
),
и
транзакция
В
выполняет
свою
операцию
.
•
Если
операции
А
и
В
конфликтуют
,
то
если
t
(
А
)>
t
(
В
) (
т
.
е
.
транзакция
А
является
более
«
молодой
»,
чем
В
),
то
транзакция
А
откатывается
и
,
получив
новую
временную
метку
,
начинается
заново
.
Транзакция
В
продолжает
работу
.
•
Если
же
t
(
А
)<
t
(
В
) (
А
«
старше
»
В
),
то
транзакция
В
откатывается
и
,
получив
новую
временную
метку
,
начинается
заново
.
Транзакция
А
продолжает
работу
.
В
итоге
система
обеспечивает
такую
работу
,
при
которой
при
возникновении
конфликтов
всегда
откатывается
более
«
молодая
»
транзакция
(
начавшаяся
позже
).
Очевидным
недостатком
метода
временных
меток
является
то
,
что
может
откатиться
более
«
дорогая
»
транзакция
,
начавшаяся
позже
более
«
дешевой
».
К
другим
недостаткам
метода
временных
меток
относятся
потенциально
более
частые
откаты
транзакций
,
чем
в
случае
использования
блокировок
.
Это
связано
с
тем
,
что
конфликтность
транзакций
определяется
более
грубо
.
Однако
в
системах
с
распределенными
базами
данных
эти
недостатки
окупаются
тем
,
что
при
использовании
метода
временных
меток
не
требуется
распознавать
тупики
(
они
не
возникают
).
Построение
же
графа
ожидания
для