20июн
Транзакция. Как работает транзакция в ORACLE.
Логика работы транзакции. Операторы управления транзакциями. Особенности выполнения транзакции. Об этом данная статья.
В ORACLE нет явного оператора, чтобы начать транзакцию, но и нет автоматического завершения транзакции. Транзакция автоматически начинается с первого оператора, который начал изменения, то есть установил блокировку TX. Заканчивается явным оператором окончания транзакции.
Операторы управления транзакциями:
- COMMIT
- ROLLBACK
- SAVEPOINT
- ROLLBACK TO
-
- SET TRANSACTION
-
Приведу немного подробностей по каждому оператору.
- COMMIT. Оператор COMMIT завершает транзакцию и делает любые выполненные в ней изменения постоянными. Освобождаются блокировки.
- ROLLBACK. Оператор отката завершает транзакцию и отменяет все выполненные в ней и незафиксированные изменения. Для этого он читает информацию из сегментов отката и восстанавливает блоки данных в состояние, в котором они находились до начала транзакции. Освобождаются блокировки.
По завершении транзакции необходимо явно указывать одну из команд завершения транзакции иначе за вас это сделает среда, в которой вы работаете (а среда не всегда это делает так, как вы предполагаете).
- SAVEPOINT. Позволяет создать в транзакции точку сохранения. В одной транзакции можно выполнять оператор SAVEPOINT несколько раз, устанавливая несколько точек сохранения. Точки сохранения позволяют устанавливать маркеры внутри транзакции таким образом, чтобы была возможность отмены только части работы, проделанной в транзакции. Оправдано использование точек сохранения в продолжительных и сложных транзакциях. ORACLE освобождает блокировки, которые были установлены отменённым оператором.
- ROLLBACK TO <точка сохранения>. Этот оператор используется совместно с представленным выше оператором SAVEPOINT. Транзакцию можно откатить до указанной точки сохранения, не отменяя все сделанные до нее изменения. Таким образом, можно выполнить два оператора UPDATE, затем — оператор SAVEPOINT, а после него — два оператора DELETE. При возникновении ошибки или исключительной ситуации в ходе выполнения операторов DELETE транзакция будет откатываться до указанной оператором SAVEPOINT точки сохранения; при этом будут отменяться операторы DELETE, но не операторы UPDATE.
- SET TRANSACTION. Этот оператор позволяет устанавливать атрибуты транзакции, такие как уровень изолированности и то, будет ли она использоваться только для чтения данных или для чтения и записи. Этот оператор также позволяет привязать транзакцию к определенному сегменту отката.
-
Некоторые особенности выполнения транзакций в ORACLE:
- Транзакция обычно состоит из нескольких операторов DML . Если один оператор дает сбой, то он один откатывается. То есть все операторы, которые раньше были выполнены, не откатываются автоматически – результаты их работы не пропадают. Вы можете дальше продолжать транзакцию. Затем её или зафиксировать, или откатить. А получаем мы такой эффект потому, что ORACLE каждый оператор транзакции помещает в неявные операторы Savepoint так, как это показано далее:
Savepoint statement1;
Оператор1;
If error then rollback to statement1;
Savepoint statement2;
Оператор2;
If error then rollback to statement2;
- Понятие неделимости распространяется на необходимую глубину. Например, мы вставляет записи в таблицу 1, что вызывает срабатывание триггера на вставку записей в таблицу 2, что в свою очередь вызывает срабатывание триггера на обновление таблицы 3 и так далее. Если в какой-то момент происходит откат нашего оператора по таблице 1, то отменяются и все изменения, произведенные в таблице 2,3, и т.д. То есть или все изменения фиксируются, или все отменяется.
- ORACLE анонимный блок PL/SQL считает оператором.
Например, begin оператор1; оператор2; end;
То есть для него применимо предыдущее замечание.
- Ограничение целостности проверяются после выполнения каждого sql-оператора. ORACLE разрешает делать некоторые строки таблицы несогласованными до конца выполнения sql-оператора.
- В ORACLE есть возможность отложить проверку целостности на любой момент времени до конца транзакции. Это реализуется с помощью ограничения deferrable таблицы и перевода ограничения в режим deferred.
- В целях экономии места в сегментах отката не фиксируйте изменения чаще, чем это нужно по логике программы. Просто нужно определить оптимальный размер сегментов отката.
- В ORACLE можно использовать распределенные транзакции, то есть выполнять транзакцию, в которой операторы работают на удаленных сервера (распределенная база данных). Для доступа к удаленной базе данных используется объект database link. Распределённая транзакция выглядит примерно так:
update table1 set x=1; update remote_table1@remote_database set x=1; commit;
Распределённая транзакция имеет то же свойство, что и обычная: все или ничего. Только фиксация происходит в две стадии (двухфазная фиксация транзакции): сначала мастер-сервер опрашивает о готовности все подчинённые сервера, затем, в случае если все сервера готовы, дает команду фиксировать транзакцию. Если хотя бы один сервер при опросе был не готов, то транзакция откатывается на всех серверах.
- В ORACLE продолжительность транзакции не ограничивается, потому что проблемы поедания ресурсов блокировками не существует. Транзакция длится столько, сколько нужно приложению. Единственная проблема: при очень длительных транзакциях и маленьком сегменте отката возможна ошибка ORA-1555.
- В связи с тем, что мы сейчас разбираемся с понятием транзакции, мне кажется очень уместным привести выдержку из Тома Кайта:
При разработке приложений баз данных я использую очень простую мантру:
- если можно, сделай это с помощью одного оператора SQL(потому что это будет быстрее);
- если это нельзя сделать с помощью одного оператора SQL, сделай это в PL/SQL;
- если это нельзя сделать в PL/SQL, попытайся использовать хранимую процедуру на языке Java;
- если это нельзя сделать в Java, сделай это в виде внешней процедуры на языке С;
- если это нельзя реализовать в виде внешней процедуры на языке С, надо серьезно подумать, зачем это вообще делать..
Новый комментарий
|
Поиск по блогам
Подпишись на RSS:
Читателям
Рекомендую к прочтению
Разделы блога
Последние публикации
Последние коментарии
- Александр
on Soft parse и hard parse – частичный разбор и полный разбор операторов.
- Сергей
on Сортировка, параметры SORT_AREA_SIZE, SORT_AREA_RETAINED_SIZE, PGA_AGGREGATE_TARGET, WORKAREA_SIZE_POLICY.
- dbstalker
on Сортировка, параметры SORT_AREA_SIZE, SORT_AREA_RETAINED_SIZE, PGA_AGGREGATE_TARGET, WORKAREA_SIZE_POLICY.
- Cергей
on Сортировка, параметры SORT_AREA_SIZE, SORT_AREA_RETAINED_SIZE, PGA_AGGREGATE_TARGET, WORKAREA_SIZE_POLICY.
- dbstalker
on Перенос базы данных под управлением ORACLE на другой компьютер.
- Андрей
on Перенос базы данных под управлением ORACLE на другой компьютер.
- Shiko
on Гетерогенный сервис.
- Orange
on Функционирование резервной базы данных (standby). Заметки по собственному опыту -2
- Галкин Владимир
on Как организовать резервирование базы данных?
- Alex Volny
on Транзакция. Операторы DDL и фиксация транзакций.
- Orange
on Как осуществить перенос файлов данных БД ORACLE на другой диск?
- denix1
on Cursor_sharing='FORCE' - удивительные последствия: rows will be truncated
- viman
on Cursor_sharing='FORCE' - удивительные последствия: rows will be truncated
- dbstalker
on Убить мёртвую сессию. В копилку администратору
- гость
on Убить мёртвую сессию. В копилку администратору
|