47884 (597365), страница 24
Текст из файла (страница 24)
Более того, возможно, потребуется повторно выполнить определенную успешно завершившуюся до аварийного отказа транзакцию при перезагрузке системы, если не были физически выполнены обновления этой транзакции.
Для определения во время перезагрузки, какую транзакцию отменить, а какую выполнить повторно система в некотором предписанном интервале (когда в журнале накапливается определенное число записей) автоматически принимает контрольную точку. Принятие контрольной точки включает физическую запись содержимого рабочих буферов базы данных непосредственно в базу данных и специальную физическую запись контрольной точки, которая предоставляет список всех осуществляемых в данный момент транзакций. На рис. 15.1 рассматривается пять возможных вариантов выполнения транзакций до аварийного сбоя системы.
р
ис. 15.1 Варианты выполнения пяти транзакций.
Пояснения к рис. 15.1:
-
Отказ системы произошел в момент времени tf.
-
Близлежащая к моменту времени tf контрольная точка была принята в момент времени tc.
-
Транзакция Т1 успешно завершена до момента времени tc.
-
Транзакция Т2 начата до момента времени tc и успешно завершена после момента времени tc, но до момента времени tf.
-
Транзакция ТЗ также начата до момента времени tc, но не завершена к моменту времени tf
-
Транзакция Т4 начата после момента времени tc и успешно завершена до момента времени tf.
-
Транзакция Т5 также начата после момента времени tc, но не завершена к моменту времени tf.
Очевидно, что при перезагрузке системы транзакции типа ТЗ и Т5 должны быть отменены, а транзакции типа Т2 и Т4 – выполнены повторно. Тем не менее заметьте, что транзакции типа Т1 вообще не включаются в процесс перезагрузки, так как обновления попали в базу данных еще до момента времени tc (т.е. зафиксированы еще до принятия контрольной точки). Отметьте также, что транзакции, завершившиеся неудачно (в том числе отмененные) перед моментом времени tf, вообще не будут вовлечены в процесс перезагрузки.
-
Параллелизм. Проблемы параллелизма
Термин параллелизм означает возможность одновременной обработки в СУБД многих транзакций с доступом к одним и тем же данным, причем в одно и то же время. В такой системе для корректной обработки параллельных транзакций без возникновения конфликтных ситуаций необходимо использовать некоторый метод управления параллелизмом.
Каждый метод управления параллелизмом предназначен для решения некоторой конкретной задачи. Тем не менее, при обработке правильно составленных транзакций возникают ситуации, которые могут привести к получению неправильного результата из-за взаимных помех среди некоторых транзакций. (Обратите внимание, что вносящая помеху транзакция сама по себе может быть правильной. Неправильный конечный результат возникает по причине бесконтрольного чередования операций из двух правильных транзакций). Основные проблемы, возникающие при параллельной обработке транзакций следующие:
-
проблема потери результатов обновления;
-
проблема незафиксированной зависимости;
-
проблема несовместимого анализа.
-
Проблема потери результатов обновления
Рассмотрим ситуацию, показанную на рис. 15.2, в такой интерпретации: транзакция A извлекает некоторый кортеж p в момент времени t1; транзакция B извлекает некоторый кортеж p в момент времени t2; транзакция A обновляет некоторый кортеж p (на основе значений, полученных в момент времени t1) в момент времени t3; транзакция B обновляет тот же кортеж р (на основе значений, полученных в момент времени t2, которые имеют те же значения, что и в момент времени t1) в момент времени t4. Однако результат операции обновления, выполненной транзакцией A, будет утерян, поскольку в момент времени t4 она не будет учтена и потому будет "отменена" операцией обновления, выполненной транзакцией B.
Транзакция A | Время | Транзакция B |
Извлечение кортежа р | t1 | – |
– | t2 | Извлечение кортежа р |
Обновление кортежа р | t3 | – |
– | t4 | Обновление кортежа р |
рис. 15.2. Потеря в момент времени t4 результатов обновления, выполненного транзакцией A.
-
Проблема незафиксированной зависимости
Проблема незафиксированной зависимости появляется, если с помощью некоторой транзакции осуществляется извлечение (или, что еще хуже, обновление) некоторого кортежа, который в данный момент обновляется другой транзакцией, но это обновление еще не закончено. Таким образом, если обновление не завершено, существует некоторая вероятность того, что оно не будет завершено никогда. (Более того, в подобном случае может быть выполнен возврат к предыдущему состоянию кортежа с отменой выполнения транзакции.) B таком случае, в первой транзакции будут принимать участие данные, которых больше не существует. Эта ситуация показана на рис. 15.3, рис. 15.4.
В первом примере (рис. 15.3) транзакция A в момент времени t2 встречается с невыполненным обновлением (оно также называется невыполненным изменением). Затем это обновление отменяется в момент времени t3. Таким образом, транзакция A выполняется на основе фальшивого предположения, что кортеж р имеет некоторое значение в момент времени t2, тогда как на самом деле он имеет некоторое значение, существовавшее еще в момент времени t1. В итоге после выполнения транзакции A будет получен неверный результат. Кроме того, обратите внимание, что отмена выполнения транзакции B может произойти не по вине транзакции B, а, например, в результате краха системы. (К этому времени выполнение транзакции A может быть уже завершено, а потому крушение системы не приведет к отмене выполнения транзакции A.)
Транзакция A | Время | Транзакция B |
– | t1 | Обновление кортежа р |
Извлечение кортежа р | t2 | – |
– | t3 | Отмена выполнения транзакции |
рис. 15.3. Транзакция A становится зависимой от невыполненного изменения в момент времени t2.
Транзакция A | Время | Транзакция B |
– | t1 | Обновление кортежа р |
Обновление кортежа р | t2 | – |
– | t3 | Отмена выполнения транзакции |
рис. 15.4. Транзакция A обновляет невыполненное изменение в момент времени t2, и результаты этого обновления утрачиваются в момент времени t3.
Второй пример, приведенный на рис. 15.4, иллюстрирует другой случай. Не только транзакция A становится зависимой от изменения, не выполненного в момент времени t2, но также в момент времени t3 фактически утрачивается результат обновления, поскольку отмена выполнения транзакции B в момент времени t3 приводит к восстановлению кортежа р к исходному значению в момент времени t1. Это еще один вариант проблемы потери результатов обновления.
-
Проблема несовместимого анализа
На рис. 15.5 показаны транзакции A и B, которые выполняются для кортежей со счетами (табл. 9.1). При этом транзакция A суммирует балансы, транзакция B производит перевод суммы 10 со счета 3 на счет 1. Полученный в итоге транзакции A результат 110, очевидно, неверен, и если он будет записан в базе данных, то в ней может возникнуть проблема несовместимости. В таком случае говорят, что транзакция A встретилась с несовместимым состоянием и на его основе был выполнен несовместимый анализ. Обратите внимание на следующее различие между этим примером и предыдущим: здесь не идет речь о зависимости транзакции A от транзакции B, так как транзакция B выполнила все обновления до того, как транзакция A извлекла СЧЕТ 3.
табл. 15.1 Остатки на счетах до выполнения транзакций.
Счет | СЧЕТ 1 | СЧЕТ 2 | СЧЕТ 3 |
Остаток | 40 | 50 | 30 |
Транзакция A | Время | Транзакция B |
Извлечение кортежа СЧЕТ 1: СУММА = 40 | t1 | – |
Извлечение кортежа СЧЕТ 1: СУММА = 90 | t2 | – |
– | t3 | Извлечение кортежа СЧЕТ 3: |
– | t4 | Обновление кортежа СЧЕТ 3: 30 20 |
– | t5 | Извлечение кортежа СЧЕТ 1: |
– | t6 | Обновление кортежа СЧЕТ 1: 40 50 |
– | t7 | Завершение выполнения транзакции |
Извлечение кортежа СЧЕТ 3: СУММА = 110 (а не 120) | t8 | – |
рис. 15.5. Транзакция A выполнила несовместимый анализ.
-
Понятие блокировки
Описанные выше проблемы могут быть разрешены с помощью методики управления параллельным выполнением процессов под названием блокировка. Ее основная идея очень проста: в случае, когда для выполнения некоторой транзакции необходимо, чтобы некоторый объект (обычно это кортеж базы данных) не изменялся непредсказуемо и без ведома этой транзакции (как это обычно бывает), такой объект блокируется. Таким образом, эффект блокировки состоит в том, чтобы "заблокировать доступ к этому объекту со стороны других транзакций", а значит, предотвратить непредсказуемое изменение этого объекта. Следовательно, первая транзакция в состоянии выполнить всю необходимую обработку с учетом того, что обрабатываемый объект остается в стабильном состоянии настолько долго, насколько это нужно.
Предположим, что в системе поддерживается два типа блокировок: блокировка без взаимного доступа (монопольная блокировка), называемая Х-блокировкой (X locks – exclusive locks), и блокировка с взаимным доступом, называемая S-блокировкой (S locks - Shared locks). Замечание. Х- и S-блокировки иногда называют блокировками записи и чтения соответственно. Предположим, что Х- и S-блокировки единственно возможные, хотя в коммерческих системах существуют блокировки других типов. Кроме того, допустим, что в кортежи являются единственным типом "блокируемого объекта", хотя опять же н в коммерческих системах могут блокироваться и другие объекты. Ниже показано функционирование механизма блокировок.
-
Если транзакция A блокирует кортеж р без возможности взаимного доступа (Х‑блокировка), то запрос другой транзакции B с блокировкой этого кортежа p будет отменен.
-
Если транзакция A блокирует кортеж р с возможностью взаимного доступа (S‑блокировка), то:
-
запрос со стороны некоторой транзакции B на Х‑блокировку кортежа будет отвергнут;
-
запрос со стороны некоторой транзакции B на S‑блокировку кортежа р будет принят (т.е. транзакция B также будет блокировать кортеж р с помощью S‑блокировки).
-
Эти правила можно наглядно представить в виде матрицы совместимости, показанной на рис. 15.6, и интерпретировать ее следующим образом. Рассмотрим некоторый кортеж р и предположим, что транзакция A блокирую кортеж р различными типами блокировки (это обозначено соответствующими символами S и X, а отсутствие блокировки — прочерком). Предположим также, что некоторая транзакция B запрашивает блокировку кортежа р, что обозначено в первом слева столбце матрицы на рис. 15.6 (для полноты картины в таблице также приведен случай "отсутствия блокировки"). В других ячейках матрицы символ N обозначает конфликтную ситуацию (запрос со стороны транзакции B не может быть удовлетворен, и сама эта транзакция переходит в состояние ожидания), a Y – полную совместимость (запрос со стороны транзакции B удовлетворен). Очевидно, что эта матрица является симметричной.
X | S | – | |
X | N | N | Y |
S | N | Y | Y |
– | Y | Y | Y |
рис. 15.6. Матрица совместимости для Х- и S-блокировки.
Введем протокол доступа к данным, который на основе введения только что описанных Х- и S-блокировки позволяет избежать возникновения проблем параллелизма.
-
Транзакция, предназначенная для извлечения кортежа, прежде всего должна наложить S‑блокировку на этот кортеж.
-
Транзакция, предназначенная для обновления кортежа, прежде всего должна наложить Х–блокировку на этот кортеж. Иначе говоря, если, например, для последовательности действий типа извлечение/обновление для кортежа уже задана S-блокировка, то ее необходимо заменить Х‑блокировкой. Блокировки в транзакциях обычно задаются неявным образом: например, запрос на "извлечение кортежа" является неявным запросом с S-блокировкой, а запрос на "обновление кортежа" – неявным запросом с Х‑блокировкой соответствующего кортежа. При этом под термином "обновление" (как и ранее) подразумеваются помимо самих операций обновления также операции вставки и удаления.
-
Если запрашиваемая блокировка со стороны транзакции B отвергается из-за конфликта с некоторой другой блокировкой со стороны транзакции A, то транзакция B переходит в состояние ожидания. Причем транзакция B будет находиться в состоянии ожидания до тех пор, пока не будет снята блокировка, заданная транзакцией A. В системе обязательно должны быть предусмотрены способы устранения бесконечно долгого состояния ожидания транзакции B.
-
Х–блокировки сохраняются вплоть до конца выполнения транзакции (до операции "завершение выполнения" или "отмена выполнения"). S‑блокировки также обычно сохраняются вплоть до этого момента.
-
-
Решение проблем параллелизма
-
Рассмотрим решение проблем параллелизма с помощью механизма блокировок.
-
Проблема потери результатов обновления.
На рис. 15.7 приведена измененная версия процесса, показанного на рис. 15.2, с учетом применения протокола блокировки для чередующихся операций. Операция обновления для транзакции A в момент времени t3 не будет выполнена, поскольку она является неявным запросом с заданием Х-блокировки для кортежа р, а этот запрос вступает в конфликт с S-блокировкой, уже заданной транзакцией B. Таким образом, транзакция A переходит в состояние ожидания. По аналогичным причинам транзакция B переходит в состояние ожидания в момент времени t4.Обновления теперь не утрачиваются, однако возникает новая проблема – бесконечное ожидание или тупиковая ситуация. Способы решения этой проблемы рассматриваются ниже.
Транзакция A | Время | Транзакция B |
Извлечение кортежа р (задание S-блокировки для p) | t1 | – |
– | t2 | Извлечение кортежа р (задание S-блокировки для p) |
Обновление кортежа р (задание X-блокировки для p) | t3 | – |
Ожидание | t4 | Обновление кортежа р (задание X-блокировки для p) |
Ожидание | Ожидание |
рис. 15.7. Хотя обновления не утрачиваются, но в момент времени t4 возникает тупиковая ситуация.
-
Проблема незафиксированной зависимости.
На рис. 15.8, рис. 15.9 приведены в измененном виде примеры, показанные ранее на рис. 15.3 и рис. 15.4 соответственно. Они демонстрируют чередующееся выполнение операций согласно описанному выше протоколу блокировки. Операция для транзакции A в момент времени t2 (извлечение на рис. 15.8 и обновление на рис. 15.9) не будет выполнена. Дело в том, что она является неявным запросом с заданием блокировки для кортежа р, а этот запрос вступает в конфликт с Х-блокировкой, уже заданной транзакцией B. Таким образом, транзакция A переходит в состояние ожидания до тех пор, пока не будет прекращено выполнение транзакции B (до операции окончания или отмены выполнения транзакции B). Тогда заданная транзакцией B блокировка будет снята и транзакция A может быть выполнена. Причем транзакция A будет иметь дело с некоторым фиксированным значением (либо существовавшим до выполнения транзакции B при отмене ее выполнения, либо полученным после выполнения транзакции B). В любом случае транзакция A больше не зависит от незафиксированного обновления.
Транзакция A | Время | Транзакция B |
– | t1 | Обновление кортежа р (задание X-блокировки для p) |
Извлечение кортежа р (задание S-блокировки для p) | t2 | – |
Ожидание | t3 | Отмена выполнения транзакции (снятие X-блокировки для p) |
Итог: Извлечение кортежа р (задание S-блокировки для p) | t4 |
рис. 15.8. Транзакция A предохраняется от выполнения операций с незафиксированным изменением в момент времени t2.
Транзакция A | Время | Транзакция B |
– | t1 | Обновление кортежа р (задание X-блокировки для p) |
Обновление кортежа р (задание X-блокировки для p) | t2 | – |
Ожидание | t3 | Отмена выполнения транзакции (снятие X-блокировки для p) |
Итог: Обновление кортежа р (задание X-блокировки для p) | t4 |
рис. 15.9. Транзакция A предохраняется от выполнения операций с незафиксированным изменением в момент времени t2.
-
Проблема несовместимого анализа
На рис. 15.10 приведена измененная версия отношения (рис. 15.5) с перечислением чередующихся транзакций согласно протоколу блокировки. Операция обновления для транзакции B в момент времени t6 не будет выполнена. Дело в том, что она является неявным запросом с заданием Х-блокировки для кортежа СЧЕТ 1, а этот запрос вступает в конфликт с S-блокировкой, уже заданной транзакцией A. Таким образом, транзакция B переходит в состояние ожидания. Точно так же операция извлечения для транзакции A в момент времени t7 не будет выполнена. Дело в том, что она является неявным запросом с заданием S-блокировки для кортежа СЧЕТ 3, а этот запрос вступает в конфликт с Х‑блокировкой, уже заданной транзакцией B. Таким образом, транзакция A переходит в состояние ожидания. Следовательно, блокировка хотя и помогает решить одну проблему (а именно проблему несовместимого анализа), но приводит к необходимости решения другой проблемы (а именно проблемы возникновения тупиковой ситуации).
СЧЕТ 1 40 | СЧЕТ 2 50 | СЧЕТ 3 30 |
Транзакция A | Время | Транзакция B |
Извлечение кортежа СЧЕТ 1: (задание S-блокировки для СЧЕТ 1) СУММА = 40 | t1 | – |
Извлечение кортежа СЧЕТ 1: (задание S-блокировки для СЧЕТ 2) СУММА = 90 | t2 | – |
– | t3 | Извлечение кортежа СЧЕТ 3: (задание S-блокировки для СЧЕТ 3) |
– | t4 | Обновление кортежа СЧЕТ 3: (задание X-блокировки для СЧЕТ 3) 30 20 |
– | t5 | Извлечение кортежа СЧЕТ 1: (задание S-блокировки для СЧЕТ 1) |
– | t6 | Обновление кортежа СЧЕТ 1: (задание X-блокировки для СЧЕТ 1) 40 50 |
– | t7 | Ожидание |
Извлечение кортежа СЧЕТ 3: (задание S-блокировки для СЧЕТ 3) | t8 | Ожидание |
Ожидание | Ожидание |
рис. 15.10. Проблема несовместимого анализа разрешается, но в момент времени t7 возникает тупиковая ситуация.
-
Тупиковые ситуации
Как было показано выше, блокировку можно использовать для разрешения трех основных проблем, возникающих при параллельной обработке кортежей. К сожалению, использование блокировок приводит к возникновению другой проблемы – тупиковой ситуации. На рис. 15.11 показан обобщенный пример этой проблемы, в котором p1 и p2 представляют любые блокируемые объекты, необязательно кортежи базы данных, а выражения типа "блокировка ... без взаимного доступа" представляют любые операции с наложением блокировки без взаимного доступа, заданные как явно, так и неявно.
Транзакция A | Время | Транзакция B |
Блокировка р1 без взаимного доступа | t1 | – |
– | t2 | Блокировка р2 без взаимного доступа |
Блокировка р2 без взаимного доступа | t3 | – |
Ожидание | t4 | Блокировка р1 без взаимного доступа |
Ожидание | Ожидание |
рис. 15.11. Пример тупиковой ситуации.