Файл: Управление данными (пособие).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 1574

Скачиваний: 23

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

166

Результат

.  

После

 

окончания

 

обеих

 

транзакций

кортеж

 

Р

 

содержит

 

значение

 

Р

2

занесенное

 

более

 

поздней

 

транзакцией

 

В

Транзакция

 

А

 

ничего

 

не

 

знает

 

о

 

существовании

 

транзакции

 

В

и

 

естественно

 

ожидает

что

 

в

 

строке

 

Р

 

содержится

 

значение

 

Р

1

.

Таким

 

образом

транзакция

 

А

 

потеряла

 

результаты

 

своей

 

работы

 
 

Проблема

 

незафиксированной

 

зависимости

 (

чтение

 «

грязных

 

данных

», 

неаккуратное

 

считывание

Транзакция

 

В

 

изменяет

 

данные

 

в

 

кортеже

 

Р

После

 

этого

 

транзакция

 

А

 

читает

 

измененные

 

данные

 

и

 

работает

 

с

 

ними

Транзакция

 

В

 

откатывается

 

и

 

восстанавливает

 

старые

 

данные

Транзакция

 

А

 

Время

Транзакция

 

В

 

 

 

 

--- 

t

1

Чтение

 

значения

 

Р

0

 

из

 

кортежа

 

Р

 

 

 

 

--- 

t

 2

Запись

 

значения

 

Р

1

 

в

 

кортеж

 

Р

 

 

 

 

Чтение

 

значения

 

Р

1

 

из

 

кортежа

 

Р

 

t

 3

---

 

 

 

 

Работа

 

с

 

прочитанными

 

данными

 

Р

1

t

 4

---

 

 

 

 

---

 

t

 5

Откат

  

транзакции

 (

восстановление

 

 

 

значения

 

Р

0

 

кортежа

 

Р

)

 

Фиксация

 

транзакции

 

t

 6

---

 

 

 

 

Результат

Работа

 

с

 «

грязными

» 

данными

 

 

 

Спрашивается

: «

С

 

какими

 

же

 

данными

 

работала

 

транзакция

 

А

?» 

Результат

.  

Получилось

 

так

что

 

транзакция

 

А

 

использовала

 

данные

которых

 

не

 

только

 

нет

 

в

 

базе

 

данных

 

после

 

окончания

 

транзакции

но

и

 

не

 

было

 

в

 

базе

 

данных

 

до

 

ее

 

начала

Действительно

после

 

отката

 

транзакции

 

В

должна

 

восстановиться

 

ситуация

как

 

если

 

бы

 

транзакция

 

В

 

вообще

 

никогда

 

не

 

выполнялась

Таким

 

образом

результаты

 

работы

 

транзакции

 

А

 

явно

 

некорректны

т

.

к

она

 

работала

 

с

 

данными

отсутствовавшими

 

в

 

базе

 

данных


background image

 

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

Результат

 

Транзакция

 

А

 

работает

 

с

 

данными

которые

с

 

ее

 

точки

так

 

как

 

сама

 

она

что

 

после

 

 

зрения

самопроизвольно

 

изменяются

 
 


background image

 

168

Несовместимый

 

анализ

 – 

фиктивные

 

элементы

 (

фантомы

Эффект

 

фиктивных

 

элементов

 

несколько

 

отличается

 

от

 

предыдущих

 

транзакций

 

тем

что

 

здесь

 

за

 

один

 

шаг

 

выполняется

 

достаточно

 

много

 

операций

а

 

именно

чтение

 

нескольких

 

кортежей

удовлетворяющих

 

некоторому

 

условию

Транзакция

 

А

 

дважды

 

выполняет

 

выборку

 

строк

 

с

 

одним

 

и

 

тем

 

же

 

условием

Между

 

выборками

 

вклинивается

 

транзакция

 

В

которая

 

добавляет

 

новую

 

строку

удовлетворяющую

 

условию

 

отбора

Транзакция

 

А

 

Время

Транзакция

 

В

 

 

 

 

t

1

--- 

Выборка

 

кортежей

удовлетворяющих

 

условию

 

а

. (

Отобрано

 

n

 

строк

 

 

--- 

t

 2

 

 

Вставка

 

нового

 

кортежа

удовлетворяющего

 

условию

 

а

 

--- 

t

 3

Фиксация

 

транзакции

 

 

 

 

t

 4

---

 

Выборка

 

кортежей

удовлетворяющих

 

условию

 

а

. (

Отобрано

 

уже

 

n

+1

 

строк

 

 

Фиксация

 

транзакции

 

t

 5

---

 

 

 

 

Результат

Появился

 

кортеж

которого

 

раньше

 

не

 

было

 

 

Транзакция

 

А

 

ничего

 

не

 

знает

 

о

 

существовании

 

транзакции

 

В

и

так

 

как

 

сама

 

она

 

ничего

 

не

 

меняет

 

в

 

базе

 

данных

то

следовательно

 

ожидает

что

 

после

 

повторного

 

отбора

 

будут

 

отобраны

 

те

 

же

 

самые

 

n

 

строк

.  

Результат

.  

Транзакция

 

А

 

в

 

двух

 

последовательных

 

одинаковых

 

выборках

 

строк

 

вопреки

 

очевидным

 

ожиданиям

 

получала

 

разные

 

результаты

При

 

повторной

 

выборке

 

появился

 

дополнительный

 (

n

+1)-

й

 

кортеж

 – 

кортеж

-

фантом

Собственно

 

несовместимый

 

анализ

 

Эффект

 

собственно

 

несовместимого

 

анализа

 

также

 

отличается

 

от

 

предыдущих

 

примеров

 

тем

что

 

в

 

смеси

 

присутствуют

 

две

 

транзакции

 – 

одна

 

длинная

другая

 

короткая

Пусть

 

длинная

 

транзакция

 

выполняет

 

некоторый

 

анализ

 

по

 

всей

 

таблице

например

подсчитывает

 

общую

 

сумму

 

денег

 

на

 

счетах

 

клиентов

 

банка

 

для

 

главного

 

бухгалтера

Пусть

 

на

 

всех

 

счетах

 

находятся

 

одинаковые

 

суммы

например

по

 100 

руб

Короткая

 

транзакция

 

в

 

этот

 

момент

 

выполняет

 

перевод

 

50 

руб

с

 

одного

 

счета

 

на

 

другой

 

так

что

 

общая

 

сумма

 

по

 

всем

 

счетам

 

не

 

меняется


background image

 

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. 

Конфликты

 

между

 

транзакциями

 

Таким

 

образом

рассмотренные

 

выше

 

примеры

 

и

 

анализ

 

проблем

 

параллелизма

 

показывают

что

 

если

 

не

 

предпринимать

 

специальных

 

мер

то

 

при

 

параллельной

 

работе

 

в

 

смеси

 

транзакций

 

нарушается

 

одно

 

из

 

важнейших

 

свойств

 

транзакции

 – 

изолированность

Транзакции

 

реально

 

могут

 

мешать

 

друг

 

другу

 

получать

 

правильные

 

результаты

.  

Однако

наверное

понятно

что

вообще

 

говоря

не

 

всякие

 

транзакции

 

мешают

 

друг

 

другу

В

 

частности

транзакции

 

не

 

мешают

 

друг

 

другу

если

 

они

 

обращаются

 

к

 

разным

 

данным

 

или

 

выполняются

 

в

 

разное

 

время

Транзакции

которые

 

пересекаются

 

во

 

времени

 

и

 

обращаются

 

к

 

одним

 

и

 

тем

 

же

 

данным

называются

 

конкурирующими

В

 

результате

 

конкуренции

 


background image

 

170

между

 

транзакциями

 

возникают

 

конфликты

 

доступа

 

к

 

данным

Различают

 

следующие

 

виды

 

конфликтов

 

W-W

  (

запись

 – 

запись

)

Первая

 

транзакция

 

изменила

 

объект

 

и

 

не

 

закончилась

Вторая

 

транзакция

 

пытается

 

изменить

 

этот

 

объект

Результат

 – 

потеря

 

обновления

 

R-W

  (

чтение

 – 

запись

)

.  

Первая

 

транзакция

 

прочитала

 

объект

 

и

 

не

 

закончилась

Вторая

 

транзакция

 

пытается

 

изменить

 

этот

 

объект

Результат

 – 

несовместимый

 

анализ

 (

неповторяемое

 

считывание

). 

 

W-R 

(

запись

 – 

чтение

)

Первая

 

транзакция

 

изменила

 

объект

 

и

 

не

 

закончилась

Вторая

 

транзакция

 

пытается

 

прочитать

 

этот

 

объект

Результат

 

– 

чтение

 «

грязных

 

данных

».  

Понятно

что

 

конфликты

 

типа

 

R-R

 (

чтение

 – 

чтение

отсутствуют

так

 

как

 

при

 

чтении

 

данные

 

не

 

изменяются

Другие

 

проблемы

 

параллелизма

  (

фантомы

 

и

 

собственно

 

несовместимый

 

анализ

являются

 

более

 

сложными

их

 

принципиальное

 

отличие

 

в

 

том

что

 

они

 

не

 

могут

 

возникать

 

при

 

работе

 

с

 

одним

 

объектом

Для

 

возникновения

 

этих

 

проблем

 

требуется

чтобы

 

транзакции

 

работали

 

с

 

целыми

 

наборами

 

данных

Введем

 

несколько

 

определений

График

 

запуска

 

набора

 

транзакций

 

назовем

 

последовательным

если

 

транзакции

 

выполняются

 

строго

 

по

 

очереди

т

.

е

элементарные

 

операции

 

транзакций

 

не

 

чередуются

 

друг

 

с

 

другом

 

Если

 

график

 

запуска

 

набора

 

транзакций

 

содержит

 

чередующиеся

 

элементарные

 

операции

 

транзакций

то

 

такой

 

график

 

называется

 

чередующимся

При

 

выполнении

 

последовательного

 

графика

 

гарантируется

что

 

транзакции

 

выполняются

 

правильно

так

 

как

 

при

 

последовательном

 

графике

 

транзакции

 

не

 

влияют

 

друг

 

на

 

друга

Два

 

графика

 

называются

 

эквивалентными

если

 

при

 

их

 

выполнении

 

будет

 

получен

 

один

 

и

 

тот

 

же

 

результат

независимо

 

от

 

начального

 

состояния

 

базы

 

данных

 

График

 

запуска

 

транзакций

 

называется

 

правильным

 

или

 

сериализуемым

 

(serial), 

если

 

он

 

эквивалентен

 

какому

-

либо

 

последовательному

 

графику

Следует

 

заметить

что

 

при

 

выполнении

 

двух

 

различных

 

последовательных

 (

а

следовательно

правильных

графиков

содержащих

 

один

 

и

 

тот

 

же

 

набор

 

транзакций

вообще

 

говоря

могут

 

быть

 

получены

 

различные

 

результаты

в

 

зависимости

 

от

 

их

 

последовательности

Действительно

пусть

 

транзакция

 

А

 

заключается

 

в

 

действии

  «

Сложить

 

Х

 

с

 1», 

а

 

транзакция

 

В

 – 

«

Удвоить

 

Х

». 

Тогда

 

последовательный

 

график

 {

А

В

даст

 

результат

 2(

Х

+1), 

а

 

последовательный

 

график

  {

В

А

даст

 

результат

  2

Х

+1. 

Таким

 

образом

может