Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по субд Крупская.doc
Скачиваний:
57
Добавлен:
15.06.2014
Размер:
2 Мб
Скачать
☆

Итерационное управление

Для повторения выполнения группы операторов в PL/SQL-программах можно применять циклы. В примерах псевдопрограмм, приведенных ниже, продемонстрировано использование базовых циклов, циклов WHILE и FOR.

-- БАЗОВЫЙ ЦИКЛ (LOOP) С ИСПОЛЬЗОВАНИЕМ EXIT – WHEN

loop

оператор 1;

оператор 2;

exit whenусловие;

end loop;

-- ЦИКЛ WHILE

while условие loop

оператор 1;

оператор 2;

endloop;

-- ЦИКЛ FOR С ВЛОЖЕННЫМИ ЦИКЛОМ И МЕТКАМИ

« внешний_цикл » – метка или имя цикла

for x in у.. z loop

внешний_оператор1;

« внутренний_цикл »

loop

внутренний_оператор1;

внутренний_оператор2;

exitвнешний_циклwhenусловие1;

exitвнутренний_циклwhenусловие2;

end loop внутренний_цикл;

внешний_оператор2;

end loop внешний_цикл;

Для завершения каждого базового цикла необходимо использовать при его определении либо оператор EXIT WHEN, либо оператор EXIT; в противном случае цикл будет выполняться бесконечно. При определении цикла WHILE или FOR требуется описывать способ завершения этого цикла. В третьем примере показано, как организовывать вложение циклов, применять для именования циклов специальные метки и ссылаться на определенные циклы по имени в операторах EXIT и END LOOP.

53 Понятие транзакции и виды блокировок Oracle

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

Понятие транзакции является очень важным для программ, изменяющих содержимое базы данных, так как позволяет обеспечить ее целостность. Транзакции в реляционной СУБД подчиняются следующему правилу:

“Инструкции, входящие в транзакцию, рассматриваются как неделимое целое. Либо все инструкции будут выполнены успешно, либо ни одна из них не должна быть выполнена”.

В большинстве коммерческих СУБД для повышения степени параллельности доступа нескольких пользователей к одной базе данных используются блокировки различных типов. Наиболее широко распространены два из них:

• Когда транзакция извлекает информацию из базы данных, СУБД применяет нежесткуюблокировку. При этом другие транзакции, выполняемые параллельно, могут извлекать те же данные.

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

Явная блокировка.Если программа обращается к таблице многократно, затраты, связанные с блокировкой большого количества маленьких участков таблицы, могут оказаться значительными. Например, программа пакетного обновления, которая обращается к каждой строке таблицы, в процессе работы будет блокировать таблицу по частям. Для более быстрого выполнения транзакции такого типа программе следует явно заблокировать всю таблицу, выполнить все необходимые обновления, а затем разблокировать ее. Блокировка всей таблицы имеет три преимущества:

• она устраняет затраты, связанные с блокировкой строк (страниц);

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

• она исключает возможность того, что другая транзакция заблокирует часть таблицы и “запрёт в тупике” программу пакетного обновления, вынуждая ее начать выполнение повторно.