Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Ораклу.doc
Скачиваний:
1
Добавлен:
10.08.2019
Размер:
467.46 Кб
Скачать

Начало и завершение транзакции

Транзакция по умолчанию начинается с первой команды, которая изменяет записи в таблицах. Напомню, к этим командам относятся INSERT, UPDATE, DELETE. В момент начала транзакции ORACLE запоминает первую команду и приступает к протоколированию изменений. При этом команды внутри транзакции будут учитывать изменения, которые сделаны предыдущими командами. Это относится и к команде SELECT внутри транзакции.

На примере добавления тестового набора, мы видели, что команды UPDATE используют данные, которые были "только что" занесены командой INSERT.

Если команда SELECT выполняется вне транзакции, то она не начинает транзакцию, потому что она не изменяет данные. Только читает их из таблиц.

Транзакция всегда завершается. Это происходит либо явно, либо неявно.

Явное завершение - когда пользователь вводит команду COMMIT, либо команду ROLLBACK.

Транзакция может быть завершена с фиксацией изменений или с отменой. Команда COMMIT фиксирует изменения, команда ROLLBACK отменяет все сделанные изменения.

Если в момент завершения мы дадим команду отмены, то наше состояние вернётся в состояние перед началом транзакции.

Неявное завершение транзакции - когда пользователь не вводит команду COMMIT или ROLLBACK. Такое завершение транзакции происходит, когда пользователь вводит команду языка описания данных DML, либо когда он прекращает сеанс, а точнее разрывает его. Например, закрывает программу SQL*Plus по кнопке "Закрыть окно" или клавиатурной комбинацией ALT+F4, или когда по сети происходит сбой и соединение разрывается.

Пакетная передача команд

С нова вернемся к скрипту в учебном примере. Рассмотрим, как он работает. Программа-клиент последовательно выполняет команды из скрипта. Каждая команда передаётся на сервер базы данных и там выполняется. После завершения команды сервер возвращает результат её работы и код завершения. Либо команда завершилась хорошо, без ошибки, либо с ошибкой.

Рисунок 2. Выполнение PL/SQL блока.

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

Есть альтернатива. Можно передать на сервер все команды за один раз. Пакетная передача может быть осуществлена с помощью PL/SQL блоков, т.е. небольшой программы на языке программирования PL/SQL.

Для оформления наших команд в форме блока достаточно в начале дописать ключевое слово BEGIN и закончить последовательность команд словом END. Таким образом, все команды будут записаны между ключевыми словами BEGIN и END. Программа-клиент передаёт текст блока серверу базы данных за одно обращение, т.е. весь список команд передаётся один раз. Сервер выполняет все команды в блоке и после этого возвращает код завершения.

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

При создании таблиц мы исходили из того, что в них будут храниться записи нескольких счетов. Мы подготовили скрипт, который вводит тестовый набор данных в таблицы. Но при этом мы не учитывали тот факт, что в таблице будут записи разных счетов. В этом уроке мы скрипт доработаем. Ограничим действие команд рамками одного счёта, причём того, с которым работаем. Для этого припишем условия к командам изменения записей UPDATE.

Для этого урока я подготовил файл ins_ex. Он содержит все команды для добавления тестового набора. Перенёс команды из нескольких файлов в один большой.