Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posibnik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.62 Mб
Скачать

Проблема зависимости от незафиксированных результатов (или "грязного" чтения)

Проблема зависимости от незафиксированных результатов возникает в том случае, если одна из транзакций получит доступ к промежуточным результатам выполнения другой транзакции до того, как они будут зафиксированы в базе данных. В табл. 8.2 приведен пример зависимости от незафиксированных результатов, вызывающий появление ошибки. В этом примере используются те же первоначальные данные для количества студентов в ТМ-32, что и в предыдущем примере.

В этом случае транзакция Т4 увеличивает значение количества студентов в группе ТМ-32 до 40 человек, после чего выполнение транзакции отменяется, поэтому СУБД должна выполнить откат транзакции с восстановлением первоначального значения количества студентов в ТМ-32, равного 30 человек. Однако к этому моменту транзакция Т3 уже успела считать измененное значение «Кол-во студентов» (40 человек) и использовала именно это значение при выполнении операции отчисления 5 студентов из группы, после чего зафиксировала в базе данных неверный результат, равный 35 студентам (вместо правильного 25 студентов). Значение «Кол-во студентов», считанное в транзакции Т4, называется грязными данными. От этого термина происходит второе название рассматриваемой проблемы проблема грязного чтения.

Таблица 8.2. Пример проблемы зависимости от незафиксированных результатов

Время

Транзакция Т3

Транзакция Т4

Поле «Кол-во студентов» записи ТМ-32

t1

Начало транзакции

30

t2

Считывание КС из «Кол-во студентов»

30

t3

КС=КС+10

40

t4

Начало транзакции

Запись КС в

«Кол-во студентов»

40

t5

Считывание КС из

«Кол-во студентов»

…………..

40

t6

КС=КС-5

Откат

35

t7

Запись КС в

«Кол-во студентов»

35

t8

Окончание транзакции

35

Проблему можно устранить, запретив транзакции Т3 считывать значение «Кол-во студентов» до принятия решения о том, должна ли быть выполнена фиксация или откат транзакции Т4.

Проблема анализа несогласованности

Проблема анализа несогласованности возникает в тех случаях, когда транзакция считывает несколько значений из базы данных, после чего вторая транзакция обновляет некоторые из этих значений непосредственно во время выполнения первой транзакции. Например, транзакция, суммирующая данные, выбранные из базы (скажем, вычисляющая общую сумму на счетах), получит неверное значение, если во время ее выполнения другая транзакция изменит считанные ею значения. Пример подобной ошибки приведен в табл. 8.3. Здесь транзакция Т6, вычисляющая итоговое значение, выполняется параллельно с транзакцией Т5.

Транзакция Т6 вычисляет суммирование количества студентов в группе ТМ-32 (30 человек), ТМ-31(25 студентов) и ТЗ-31(20 студентов). Однако в это же время транзакция Т5 осуществляет перевод 5 студентов из группы ТМ-32 в ТМ-31. В результате вычисленное транзакцией Т6 значение оказывается неверным (больше на 5 студентов). Эту проблему можно устранить, запретив транзакции T6 считывать значения количества студентов ТМ-32 и ТМ-31 до тех пор, пока транзакция Т5 не зафиксирует выполненные ею обновления.

Таблица 8.3. Пример проблемы устранения несогласованности

Время

Транзакция Т5

Транзакция Т6

Поле

«Кол-во студентов» записи

ТМ-32

Поле «Кол-во студентов» записи

ТМ-31

Поле «Кол-во студентов» записи

ТЗ-31

Общее количество студентов

t1

Начало

транзакции

30

25

20

t2

Начало транзакции

Сумма=0

30

25

20

0

t3

Считывание значение

«Кол-во студентов» из ТМ-32

Считывание

значение

«Кол-во

студентов»

из ТМ-32

30

25

20

0

t4

КС=КС-5

Сумма=Сумма+КС

25

25

20

30

t5

Запись

«Кол-во студентов»

в ТМ-32

Считывание

Значение

«Кол-во

студентов»

из ТЗ-31

25

25

20

30

t6

Считывание значение

«Кол-во студентов»

из ТМ-31

Сумма=Сумма+КС

25

25

20

50

t7

КС=КС+5

25

30

20

50

t8

Запись в

«Кол-во студентов» в

ТМ-31

25

30

20

50

t9

Окончание транзакции

Считывание

значение

«Кол-во

студентов»

из ТМ-31

25

30

20

50

t10

Сумма=Сумма+КС

25

30

20

80

t11

Окончание транзакции

25

30

20

80

Еще одна проблема может возникнуть, если в некоторой транзакции Т происходит повторное чтение ранее считанного элемента данных, но между этими операциями чтения была выполнена модификация этого элемента данных в другой транзакции. Таким образом, в транзакции Т будут получены два разных значения одного и того же элемента данных. Такую ситуацию иногда характеризуют как проблему неповторяемого (или нечеткого) чтения. Аналогичная проблема может произойти, если транзакция Т выполняет запрос, в котором происходит выборка из отношения ряда строк, удовлетворяющих некоторому предикату, а при повторном выполнении этого запроса в более поздний момент времени обнаруживается, что полученное множество строк содержит дополнительные (фантомные) строки, которые были вставлены другой транзакцией в период между двумя операциями чтения. Такую проблему иногда называют фантомным чтением.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]