Управление транзакциями в Oracle
Модель транзакций реляционной СУБД Oracle основана на «единице работы» (unit of work) и поддерживается большую часть операций над транзакциями (нельзя использовать ROLLBACK FORSE). Транзакция неявно начинается с началом сеанса или при выполнении первой команды SQL после последней команды COMMIT или ROLLBACK (фактически при первом изменении данных). Транзакция заканчивается при выполнении команды COMMIT или ROLLBACK.
Транзакция не зависит от блоков PL/SQL. Транзакции могут охватывать несколько системных блоков, или в одном блоке может быть несколько транзакций (автономных). PL/SQL поддерживает следующие команды для транзакций: COMMIT, ROLLBACK, SAVEPOINT, TRANSACTION и LOCK TABLE.
COMMIT делает изменения в БД постоянными и видимыми для других сеансов в соответствии со следующим синтаксисом:
COMMIT [WORK] [COMMENT текст];
где WORK – необязательное ключевое слово, применяется для улучшения читаемости и соответствия стандарту. Необязательный комментарий COMMENT текст может иметь длину до 50 символов.
ROLLBACK отменяет не зафиксированные изменения, сделанные в текущей транзакции, влияет до начала транзакции или до указанной точки сохранения.
ROLLBACK [WORK] [ TO [SAVEPOINT] имя_точки_сохранения];
SAVEPOINT устанавливает точку сохранения (именованную точку обработки) для текущей транзакции. Установка точки транзакции делает возможным выполнение частичного отката.
SAVEPOINT имя_точки_сохранения;
где имя_точки_сохранения – это необъявленный идентификатор. Внутри транзакции может быть установлено несколько точек сохранения. Если повторно использовать имя точки сохранения то точка передвинется на новую позицию и откат к исходной позиции данной точки сохранения будет невозможен.
SET TRANSACTION управляет типом транзакции
SET TRANSACTION тип_транзакции NAME имя
где имя – имя транзакции, доступное на протяжении ее выполнения; а тип_транзакции может принимать следующие значения:
- READ ONLY – означает начало транзакции только для чтения. Указывает СУБД, что следует обеспечить целостность по чтению БД в пределах транзакции (по умолчанию для команды). Транзакцию заканчивают команды COMMIT или ROLLBACK. Внутри такой транзакции разрешены только команды LOCK TABLE, SELECT, SELECT INTO, OPEN, FETCH, CLOSE, COMMIT и ROLLBACK. Попытка выполнения в транзакции только для чтения других команд, такие как INSERT или UPDATE, приводит к появлению ошибки ORA-1456.
- READ WRITE – обозначает начало транзакции READ WRITE; это тип по умолчанию.
- ISOLATION LEVEL SERIALIZABLE – аналогично транзакции READ ONLY обеспечивается целостность по чтению в пределах транзакции вместо поведения по умолчанию – целостности по чтению на уровне команды. Сериализуемые транзакции не позволяют изменять данные.
- ISOLATION LEVEL READ COMMITTED – если транзакции необходимы строки, заблокированные другими транзакциями, она будет ждать снятия блокировки.
- USE ROLLBACK SEGMENT имя_сегмента_отката – указывает СУБД, что следует использовать указанный сегмент отката. Полезна, когда лишь один сегмент отката имеет большой размер, и известно, что программе необходим большой сегмент отката (например, при операции закрытия в конце месяца).
Рис.
LOCK TABLE обходит неявные блокировки БД на уровне строк, явно блокируя целиком одну или несколько таблиц в указанном режиме.
LOCK TABLE список_таблиц IN режим_блокировки MODE [NOWAIT];
где список_таблиц – список таблиц, разделенных запятыми; режим_блокировки – может принимать значения ROW SHARE (SHARE UPDATE), ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE или EXCLUSIVE.
ROW SHARE разрешает конкурирующий доступ к заблокированной таблице, но запрещает пользователям блокировать всю таблицу для эксклюзивного доступа (EXCLUSIVE). ROW SHARE и SHARE UPDATE это синонимы, используются для совместимости синтаксиса более ранних версий.
ROW EXCLUSIVE аналогично ROW SHARE, за исключением того, что дополнительно запрещает блокировать в режиме SHARE. ROW EXCLUSIVE применяется СУБД автоматически при операциях INSERT, UPDATE, DELETE.
SHARE разрешает одновременные запросы к таблице, но запрещает обновлять заблокированную таблицу.
SHARE ROW EXCLUSIVE используется для просмотра всей таблицы и разрешения пользователям просматривать строки в таблицы, но запрещает другие блокировки в режиме SHARE и запрещает обновлять строки.
EXCLUSIVE разрешает запросы к заблокированной таблице, но запрещает все остальные действия.
NOWAIT означает, что база данных передает управление пользователю или программе данным разделом, подразделом или таблицей незамедлительно, даже если на них наложена блокировка другим пользователем. В этом случае БД возвращает предупреждающее сообщение о том, что другим пользователем уже была наложена блокировка. Если встречается блокировка (и указано ключевое слово NOWAIT), то СУБД генерирует исключение: ORA-00054: resource busy and acquire with NOWAIT specified.
Другими словами, NOWAIT указывает, что СУБД не должна ждать освобождения блокировки, в то время как по умолчанию при встрече блокировки СУБД бесконечно ждет ее освобождения.
Дата добавления: 2015-08-26; просмотров: 975;