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

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

Проблема зависимости от нефиксированных результатов возникает в том случае, если одна из транзакций получит доступ к промежуточным результатам выполнения другой транзакции до того, как они будут зафиксированы в базе данных. В следующей таблице приведен пример зависимости от нефиксированных результатов, вызвавшей появление ошибки. В этом примере используются те же исходные данные, что и в предыдущем примере. В данном случае транзакция Т4 увеличивает значение суммы на счету balx до 200 единиц, после чего выполнение транзакции отменяется, поэтому СУБД должна выполнить откат транзакции с восстановлением исходного значения на счету, равного 100 единицам. Однако к этому моменту транзакция Т3 уже успела считать измененное значение счета balx (200) и использовала именно это значение при выполнении операции снятия денег со счета, после чего зафиксировала в базе данных неверный результат, равный 190 единицам (вместо правильного - 90).

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

Причина выполнения отката транзакции Т4 несущественна - допустим, что при ее выполнении была обнаружена некоторая ошибка (например, введен неверный номер счета). Источник ошибки заключается в предположении транзакции ТЗ, что выполненное в транзакции Т4 изменение будет успешно зафиксировано в базе данных, хотя на самом деле имел место откат этой транзакции. Проблему можно устранить, запретив транзакции ТЗ считывать значение счета balx до тех пор, пока транзакция Т4 не будет либо зафиксирована, либо отменена.

26. Упорядочиваемость и восстанавливаемость

В предыдущем разделе мы обсудили основные проблемы, связанные с возможностью параллельного выполнения транзакций. Назначение протоколов управления параллельностью состоит подготовке такого графика выполнения транзакций, который исключит возможность их влияния на результаты работы друг друга. Одно из очевидных решений состоит в выполнении в каждый момент времени только одной транзакции - предыдущая транзакция обязательно должна быть зафиксирована, прежде чем будет разрешено начать выполнение следующей транзакции. Однако назначение многопользовательских СУБД состоит в обеспечении максимальной степени параллельности выполнения транзакций пользователей, поэтому те транзакции, которые не оказывают влияния на работу друг друга, вполне могут запускаться одновременно. Например, транзакции, обращающиеся к разным частям базы данных, не окажут влияния на работу друг друга и, следовательно, могут выполняться одновременно.

Познакомимся с понятием упорядочиваемости как со средством,

способным помочь в выявлении тех транзакций, которые гарантированно не

вызовут нарушения согласованности данных при одновременном выполнении.

Несколько определений.

График. Последовательность запуска операций множества параллельно выполняемых транзакций, сохраняющая очередность выполнения операций

в каждой отдельной транзакции.

Каждая транзакция состоит из последовательности операций, включающих чтение и запись данных в базу, которые должны завершаться фиксацией либо откатом полученных результатов. График S представляет собой последовательность операций, входящих в состав множества из n транзакций Т1, Т 2 , ….., Tn , на которую накладывается ограничение, требующее, чтобы последовательность операций каждой из исходных транзакций была сохранена. Следовательно, для каждой транзакции Тi порядок ее операций в графике S должен быть сохранен.

Последовательный график. График, в котором операции каждой из транзакций выполняются строго последовательно и не могут чередоваться с

операциями, выполняемыми в других транзакциях.

В последовательном графике транзакции выполняются строго поочередно. Например, если имеются две транзакции, Т1 и Т2 , они будут выполняться либо в последовательности Тl - Т 2 , либо в последовательности Т2 – Т1. Таким образом, при последовательном выполнении никакое взаимовлияние транзакций невозможно, поскольку в каждый момент времени выполняется только одна из транзакций. Однако нет гарантии, что результаты выполнения всех возможных последовательных графиков для заданного набора транзакций всегда будут идентичными. Например, в случае банковских операций имеет значение, на какую именно сумму был начислен процент (имеется в виду - до снятия большой суммы со счета или после этого).

Непоследовательный график. График, в котором чередуются операции из некоторого набора одновременно выполняемых транзакций.

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

позволят транзакциям выполняться параллельно, но без оказания взаимного влияния друг на друга, и, привести базу данных в состояние, которое может быть достигнуто при использовании последовательного графика.

В случае параллельного выполнения заданного множества транзакций мы будем говорить, что (непоследовательный) график является корректным, если ОН приводит к получению тех же результатов, которые получаются при использовании некоторого последовательного графика. Подобный график будем называть упорядоченным. Для предотвращения внесения в базу данных несогласованности, вызванной влиянием транзакций друг на друга, чрезвычайно важно гарантировать упорядоченность используемого графика

выполнения параллельных транзакций. В отношении достижения упорядоченности весьма важен порядок выполнения операций чтения и записи данных.

• Если две транзакции только считывают некоторый элемент данных, они не будут конфликтовать между собой и порядок их выполнения не имеет значения.

• Если две транзакции считывают или записывают совершенно независимые

элементы данных, они не будут конфликтовать между собой и порядок их

выполнения не имеет значения.

• Если одна транзакция записывает элемент данных, а другая транзакция

этот же элемент данных считывает или записывает, порядок их выполнения

имеет существенное значение.

Рассмотрим график представленный в столбцах Вариант А таблицы. Он устанавливает последовательность операции транзакций Т7 и Т8. выполняемых параллельно. Поскольку операция записи на счет balx в транзакции Т8 не конфликтует с последующей операцией чтения счета baly в транзакции Т7 можно изменить последовательность выполнения этих операций и получить эквивалентный график показанный в столбцах Вариант Б этой же таблицы. Если поменять порядок выполнения и следующих не конфликтующих между собой операций, то мы получим эквивалентный последовательный показанный в столбцах Вариант В.

• Меняем порядок выполнения операций write(balx) транзакции Т8 и

write(balx) транзакции Т7.

• Меняем порядок выполнения операций read(balx) транзакции Т8 и

read(baly) транзакции Т7.

• Меняем порядок выполнения операций read(balx) транзакции Т8 и

write(baly) транзакции Т7.

Эквивалентные графики:

Вариант А – непоследовательный график; Вариант Б - непоследовательный график, эквивалентный предыдущему графику; Вариант В - последовательный график эквивалентный двум предыдущим графикам.

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

• вершин, соответствующих каждой из транзакций;

• направленных ребер Ti –› Tj, где транзакция Тj; считывает значение элемента, записанного транзакцией Ti ;

• направленных ребер Ti –› Tj, где транзакция Тj записывает значение в элемент данных после того, как он был считан транзакцией Ti.

Если граф предшествования содержит петли, то соответствующий ему график не является конфликтно упорядоченным.

График, не являющегося конфликтно упорядоченным

Рассмотрим две транзакции, график выполнения которых представлен в следующей таблице. В транзакции T9 100 единиц передается со счета balx на счет baly. Транзакция Т10 увеличивает текущее значение каждого из этих счетов на 10%. Граф предшествования для данного графика содержит

петлю, поэтому этот график не является конфликтно упорядоченным.