10. Метод двухфазной фиксации блокировок.
Параллельное выполнение транзакций должно приводить к корректным результатам, фиксируемым в базе данных. Корректность этих результатов состоит в том, что они должны совпадать с результатами, получаемыми при последовательном выполнении транзакций. Такая схема обработки позиционируется как сериализуемая, а соответствующий план выполнения транзакций является сериализуемым. Отказ от применения процедур управления параллельным выполнением приводит к множеству различных планов среди которых имеются несериализуемые.
Пример. Предположим, что сформированы три транзакции R1, R2 и R3
BEGIN TRAN R1 x= 1; х = 2х; COMMIT TRAN R1 |
|
BEGIN TRAN R2 x= 1; х = 4х; COMMIT TRAN R2; |
|
BEGIN TRAN R3 x= 1; х = 6x; COMMIT TRAN R3; |
Существуют различные сериализуемые планы:
план 1 -Rl,R2,R3: результат x = 6
план 2 -Rl,R3,R2: результат x = 4
план 3 –R2,R3,R1: результат x = 2
план 4 –R2,R1,R3: результат x = 6
план 5 –R3,R2,R1: результат x = 2
план 6 –R3,R1,R2: результат x = 4
Приведенные планы соответствуют так называемым последовательным графикам. Известно, что график - это порядок запуска операций множества параллельно выполняемых транзакций, сохраняющий очередность выполнения операций в каждой отдельной транзакции. Последовательный график - это график, в котором операции каждой из транзакций выполняются строго по порядку и они не чередуются с операциями, выполняемыми в других транзакциях. Отличие непоследовательного графика заключается в том, что в нем допускается чередование операций, входящих в одновременно выполняемые транзакции. График для сериализуемого плана имеет следующий вид:
график 1 : x =1,х = 2х, х= 1, x = 4 x,х = 1, x = 6 x. Результат x = 6.
Примером несериализуемых графиков являются следующие:
график 2: x = 1,х = 1,х = 2х, х= 1, x = 4 x, x = 6 x. Результат x = 24;
график 3 : x = 1, x = 4x, x = 1, x = 1 , x = 2 x, x = 6x. Результат x = 12.
Известно, что основу управления параллельно выполняемыми транзакциями составляет корректное планирование конфликтующих операций. К таким операциям относятся операции, которые обращаются к одному и тому же элементу данных и, как минимум, одна из них - операция записи. Для синхронизации конфликтующих операций чтения и записи традиционно применяются двухфазная блокировка и механизм явного упорядочения операций по отметкам времени. Стратегия двухфазной блокировки заключается в том, что транзакции разрешается устанавливать блокировки по мере необходимости, но после снятия любой из активных блокировок запрещается наложение новых блокировок. Эта стратегия базируется на реализации следующих правил:
при инициировании операции доступа к данным проверяется наличие конфликта с другими транзакциями. Если конфликт существует, то выполнение операции доступа откладывается и транзакция переходит в состояние ожидания;
блокировка не может быть снята с элемента данных, если с ним осуществляется операция ввода-вывода;
после снятия блокировки, установленной транзакцией Rl, СУБД не может установить для этой транзакции новой блокировки, даже если доступ производится к другому элементу данных.
Для каждой транзакции выделяются две фазы: фаза подъема, на которой выполняется установление блокировок, и фаза спада, на которой осуществляется снятие блокировок (рис. 6.7).
В промышленных СУБД реализуется модификация двухфазной блокировки, предполагающая установление необходимых блокировок на первой фазе и снятие всех блокировок при выполнении оператора фиксации транзакции COMMIT либо оператора отката ROLLBACK.