ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 1574
Скачиваний: 23
166
Результат
.
После
окончания
обеих
транзакций
,
кортеж
Р
содержит
значение
Р
2
,
занесенное
более
поздней
транзакцией
В
.
Транзакция
А
ничего
не
знает
о
существовании
транзакции
В
,
и
естественно
ожидает
,
что
в
строке
Р
содержится
значение
Р
1
.
Таким
образом
,
транзакция
А
потеряла
результаты
своей
работы
.
Проблема
незафиксированной
зависимости
(
чтение
«
грязных
данных
»,
неаккуратное
считывание
)
Транзакция
В
изменяет
данные
в
кортеже
Р
.
После
этого
транзакция
А
читает
измененные
данные
и
работает
с
ними
.
Транзакция
В
откатывается
и
восстанавливает
старые
данные
.
Транзакция
А
Время
Транзакция
В
↓
---
t
1
Чтение
значения
Р
0
из
кортежа
Р
↓
---
t
2
Запись
значения
Р
1
в
кортеж
Р
↓
Чтение
значения
Р
1
из
кортежа
Р
t
3
---
↓
Работа
с
прочитанными
данными
Р
1
t
4
---
↓
---
t
5
Откат
транзакции
(
восстановление
↓
значения
Р
0
кортежа
Р
)
Фиксация
транзакции
t
6
---
↓
Результат
:
Работа
с
«
грязными
»
данными
Спрашивается
: «
С
какими
же
данными
работала
транзакция
А
?»
Результат
.
Получилось
так
,
что
транзакция
А
использовала
данные
,
которых
не
только
нет
в
базе
данных
после
окончания
транзакции
,
но
,
и
не
было
в
базе
данных
до
ее
начала
.
Действительно
,
после
отката
транзакции
В
,
должна
восстановиться
ситуация
,
как
если
бы
транзакция
В
вообще
никогда
не
выполнялась
.
Таким
образом
,
результаты
работы
транзакции
А
явно
некорректны
,
т
.
к
.
она
работала
с
данными
,
отсутствовавшими
в
базе
данных
.
167
Проблемы
несовместимого
анализа
Проблема
несовместимо
анализа
включает
в
себя
несколько
различных
вариантов
:
1)
неповторяемое
считывание
;
2)
фиктивные
элементы
(
фантомы
);
3)
собственно
несовместимый
анализ
.
Несовместимый
анализ
–
неповторяемое
считывание
Транзакция
А
дважды
читает
одну
и
ту
же
строку
.
Между
этими
чтениями
вклинивается
транзакция
В
,
которая
изменяет
значения
в
строке
.
Транзакция
А
Время
Транзакция
В
↓
Чтение
из
кортежа
P
значения
Р
0
t
1
---
↓
---
t
2
Чтение
из
кортежа
P
значения
Р
0
↓
---
t
3
Запись
в
кортеж
P
значения
Р
1
↓
---
t
4
Фиксация
транзакции
↓
Повторное
чтение
кортежа
P
t
5
---
(
уже
значения
Р
1
)
↓
Фиксация
транзакции
t
6
---
↓
Результат
:
Неповторяемое
считывание
Транзакция
А
ничего
не
знает
о
существовании
транзакции
В
,
и
не
меняет
значение
в
данном
кортеже
,
то
,
очевидно
,
ожидает
повторного
чтения
значение
будет
тем
же
самым
,
то
есть
Р
0
.
Результат
.
Транзакция
А
работает
с
данными
,
которые
,
с
ее
точки
,
так
как
сама
она
,
что
после
зрения
,
самопроизвольно
изменяются
.
168
Несовместимый
анализ
–
фиктивные
элементы
(
фантомы
)
Эффект
фиктивных
элементов
несколько
отличается
от
предыдущих
транзакций
тем
,
что
здесь
за
один
шаг
выполняется
достаточно
много
операций
,
а
именно
,
чтение
нескольких
кортежей
,
удовлетворяющих
некоторому
условию
.
Транзакция
А
дважды
выполняет
выборку
строк
с
одним
и
тем
же
условием
.
Между
выборками
вклинивается
транзакция
В
,
которая
добавляет
новую
строку
,
удовлетворяющую
условию
отбора
.
Транзакция
А
Время
Транзакция
В
↓
t
1
---
Выборка
кортежей
,
удовлетворяющих
условию
а
. (
Отобрано
n
строк
)
↓
---
t
2
↓
Вставка
нового
кортежа
,
удовлетворяющего
условию
а
---
t
3
Фиксация
транзакции
↓
t
4
---
Выборка
кортежей
,
удовлетворяющих
условию
а
. (
Отобрано
уже
n
+1
строк
)
↓
Фиксация
транзакции
t
5
---
↓
Результат
:
Появился
кортеж
,
которого
раньше
не
было
Транзакция
А
ничего
не
знает
о
существовании
транзакции
В
,
и
,
так
как
сама
она
ничего
не
меняет
в
базе
данных
,
то
,
следовательно
ожидает
,
что
после
повторного
отбора
будут
отобраны
те
же
самые
n
строк
.
Результат
.
Транзакция
А
в
двух
последовательных
одинаковых
выборках
строк
вопреки
очевидным
ожиданиям
получала
разные
результаты
.
При
повторной
выборке
появился
дополнительный
(
n
+1)-
й
кортеж
–
кортеж
-
фантом
.
Собственно
несовместимый
анализ
Эффект
собственно
несовместимого
анализа
также
отличается
от
предыдущих
примеров
тем
,
что
в
смеси
присутствуют
две
транзакции
–
одна
длинная
,
другая
короткая
.
Пусть
длинная
транзакция
выполняет
некоторый
анализ
по
всей
таблице
,
например
,
подсчитывает
общую
сумму
денег
на
счетах
клиентов
банка
для
главного
бухгалтера
.
Пусть
на
всех
счетах
находятся
одинаковые
суммы
,
например
,
по
100
руб
.
Короткая
транзакция
в
этот
момент
выполняет
перевод
50
руб
.
с
одного
счета
на
другой
так
,
что
общая
сумма
по
всем
счетам
не
меняется
.
169
Транзакция
А
Время
Транзакция
В
↓
t
1
---
Чтение
счета
Р
1
=100
и
суммирование
.
SUM
=100
↓
---
t
2
↓
Снятие
денег
со
счета
Р
3
.
(
на
счете
Р
3
вместо
100
уже
50)
---
t
3
↓
Помещение
денег
на
счет
Р
1
.
(
на
счете
Р
1
вместо
100
уже
150)
---
t
4
Фиксация
транзакции
↓
t
5
---
Чтение
счета
Р
2
=100
и
суммирование
.
SUM
=200
↓
t
6
---
Чтение
счета
Р
3
=50
и
суммирование
.
SUM=250
↓
Фиксация
транзакции
t
7
---
↓
Результат
:
Полученное
суммарное
значение
по
всем
счетам
250
неверно
Результат
.
Транзакция
В
все
сделала
правильно
–
деньги
переведены
с
одного
счета
на
другой
без
потери
,
однако
,
общая
сумма
в
результате
выполнения
транзакции
А
оказалась
подсчитанной
неверно
.
Так
как
в
реальной
жизни
транзакции
по
переводу
денег
в
банке
идут
обычно
непрерывно
,
то
в
данной
ситуации
следует
ожидать
,
что
правильный
ответ
на
вопрос
–
Сколько
же
денег
в
банке
? –
может
быть
не
получен
никогда
.
14.2.
Конфликты
между
транзакциями
Таким
образом
,
рассмотренные
выше
примеры
и
анализ
проблем
параллелизма
показывают
,
что
если
не
предпринимать
специальных
мер
,
то
при
параллельной
работе
в
смеси
транзакций
нарушается
одно
из
важнейших
свойств
транзакции
–
изолированность
.
Транзакции
реально
могут
мешать
друг
другу
получать
правильные
результаты
.
Однако
,
наверное
,
понятно
,
что
,
вообще
говоря
,
не
всякие
транзакции
мешают
друг
другу
.
В
частности
,
транзакции
не
мешают
друг
другу
,
если
они
обращаются
к
разным
данным
или
выполняются
в
разное
время
.
Транзакции
,
которые
пересекаются
во
времени
и
обращаются
к
одним
и
тем
же
данным
,
называются
конкурирующими
.
В
результате
конкуренции
170
между
транзакциями
возникают
конфликты
доступа
к
данным
.
Различают
следующие
виды
конфликтов
:
•
W-W
(
запись
–
запись
)
.
Первая
транзакция
изменила
объект
и
не
закончилась
.
Вторая
транзакция
пытается
изменить
этот
объект
.
Результат
–
потеря
обновления
.
•
R-W
(
чтение
–
запись
)
.
Первая
транзакция
прочитала
объект
и
не
закончилась
.
Вторая
транзакция
пытается
изменить
этот
объект
.
Результат
–
несовместимый
анализ
(
неповторяемое
считывание
).
•
W-R
(
запись
–
чтение
)
.
Первая
транзакция
изменила
объект
и
не
закончилась
.
Вторая
транзакция
пытается
прочитать
этот
объект
.
Результат
–
чтение
«
грязных
данных
».
Понятно
,
что
конфликты
типа
R-R
(
чтение
–
чтение
)
отсутствуют
,
так
как
при
чтении
данные
не
изменяются
.
Другие
проблемы
параллелизма
(
фантомы
и
собственно
несовместимый
анализ
)
являются
более
сложными
,
их
принципиальное
отличие
в
том
,
что
они
не
могут
возникать
при
работе
с
одним
объектом
.
Для
возникновения
этих
проблем
требуется
,
чтобы
транзакции
работали
с
целыми
наборами
данных
.
Введем
несколько
определений
.
График
запуска
набора
транзакций
назовем
последовательным
,
если
транзакции
выполняются
строго
по
очереди
,
т
.
е
.
элементарные
операции
транзакций
не
чередуются
друг
с
другом
.
Если
график
запуска
набора
транзакций
содержит
чередующиеся
элементарные
операции
транзакций
,
то
такой
график
называется
чередующимся
.
При
выполнении
последовательного
графика
гарантируется
,
что
транзакции
выполняются
правильно
,
так
как
при
последовательном
графике
транзакции
не
влияют
друг
на
друга
.
Два
графика
называются
эквивалентными
,
если
при
их
выполнении
будет
получен
один
и
тот
же
результат
,
независимо
от
начального
состояния
базы
данных
.
График
запуска
транзакций
называется
правильным
или
сериализуемым
(serial),
если
он
эквивалентен
какому
-
либо
последовательному
графику
.
Следует
заметить
,
что
при
выполнении
двух
различных
последовательных
(
а
,
следовательно
,
правильных
)
графиков
,
содержащих
один
и
тот
же
набор
транзакций
,
вообще
говоря
,
могут
быть
получены
различные
результаты
,
в
зависимости
от
их
последовательности
.
Действительно
,
пусть
транзакция
А
заключается
в
действии
«
Сложить
Х
с
1»,
а
транзакция
В
–
«
Удвоить
Х
».
Тогда
последовательный
график
{
А
,
В
}
даст
результат
2(
Х
+1),
а
последовательный
график
{
В
,
А
}
даст
результат
2
Х
+1.
Таким
образом
,
может