Транзакция. Операторы DDL и фиксация транзакций

dbstalker, 20 июня

В оракле существует одна команда фиксации транзакций COMMIT. Но существует такое понятие как неявный commit. Что это такое и как происходит такая фиксация транзакций.

Прочитайте, как об этом сказано в книге Тома Кайта:

Хочу вам напомнить одну простую вещь, о которой постоянно забывают: Если в вашем скрипте среди команд DML встречается команда DDL знайте – перед выполнением DDL-команды произойдет фиксация транзакции. И это не зависит от вашего желания.

Это делается путем помещения операторов DDL в неявные пары операторов фиксации (или фиксации и отката). Вот почему операторы DDL в Oracle всегда фиксируются. Операторы CREATE, ALTER и т.д. фактически выполняются, как показано в следующем псевдокоде:

Begin
Commit;
Оператор DDL
Commit;
Exception
When others then rollback;
End;

Поэтому операторы DDL всегда фиксируют транзакцию, даже если завершаются неудачно. Выполнение оператора DDL начинается с фиксации. Cначала выполняется фиксация, чтобы в случае отката не пришлось откатывать предыдущую часть транзакции. При выполнении оператора DDL фиксируются все выполненные ранее изменения, даже если сам оператор DDL выполнен неудачно. Если должен быть выполнен оператор DDL. но не требуется, чтобы он зафиксировал существующую транзакцию, можно использовать автономную транзакцию.

(Выдержка из Тома Кайта)

4 комментария

Прокоментировать

Alex Volny
16 октября 2008 г. в 18:24

Неявная фиксация касается и TRUNCATE, которая является DDL-оператором, поэтому разработчики которые хотят "сэкономить" на log-журналах и undo заменяя DELETE -> TRUNCATE, должны учитывать этот "подвох".
Иначе, код выполняющийся после TRUNCATE и вызвавший exception будет откатан(rollback) обработчиком до ближайшего commit (до после TRUNCATE), и логическая целостность транзакции может быть нарушена.

lexx
1 июля 2009 г. в 22:20

ИМХО, но это жесть. В postgresql с этим всё гораздо лучше, т.к. поведение гораздо проще.
Есть нетранзакционные операторы: создание/удаление/изменение баз и табличных пространств.
Нет автономных транзакций. По умолчанию автокоммит после каждого оператора.
После BEGIN; пишется любой скрипт из любых операторов DDL/DML, кроме вышеперечисленных.
Есть SAVEPOINTSы, которые можно ставить везде.
После коммита всё фиксируется. Всё проще пареной репы и никаких подводных камней и неявных коммитов.

Трололо
17 декабря 2009 г. в 23:16

lexx, твоя проблема в том, что ты не работал с Oracle :)

Voler
8 августа 2009 г. в 22:08

Зафиксирует транзакцию ДАЖЕ TRUNCATE TABLE <несуществующая_таблица>

 

Новый комментарий

Я не спамер: введите суму 7+2



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Шины бу
26 апреля, 2 ответа
Потрібна порада
25 апреля, 2 ответа
Посоветуйте адвоката
25 апреля, 1 ответа