Управление параллелизмом с низкими накладными расходами

       

Спекулятивная обработка однораздельных транзакций


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

В качестве примера рассмотрим двухраздельную базу данных (с разделами P1 и P2), содержащую две целочисленных записи – x в P1 и y в P2. Пусть сначала x = 5, и y = 17. Предположим, что в системе выполяются три транзакции: A, B1 и B2 (в таком порядке). A – это многораздельная транзакция, переставляющая значения в записях x и y. Транзакции B1 и B2 – это однораздельные транзакции над разделом P1, увеличивающие значение x на единицу и возвращающие полученное значение.

Процессы обоих разделов начинают выполнение первых фрагментов транзакции A, в которых читаются x и y. Процессы разделов P1 и P2 выполняют эти фрагменты и возвращают значения координатору. Поскольку транзакция A не заканчивается, нельзя начать спекулятивное выполнение B1 и B2. Если бы это позволить, то результатом транзакции B1 было бы x = 6, что неправильно. Координатор посылает процессам разделов заключительные фрагменты, в которых в разделе P1 в x записывается значение 17, а в разделе P2 в y – 5. После завершения выполнения этих фрагментов процессы разделов посылают координатору свои подтверждения "готов к фиксации" ("ready to commit") и ожидают его решения. Поскольку транзакция A закончилась, можно начинать спекулятивное выполнение транзакций. Транзакции B1 и B2 выполняются с заполнением буферов отката, и их результаты ставятся в очередь. Если бы в это время транзакции A пришлось откатиться, то B1 и B2 также были бы откачены и выполнены повторно. Если же процессу раздела P1 становится известно, что транзакция A зафиксирована, то он посылает результаты транзакций B1 и B2 клиентам и освобождает буфера отката.

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



Содержание раздела