Oracle: DDL и откат транзакций
Может ли Oracle DDL (create/alter) быть транзакционным, как в MS SQL (начиная с 2005 года)?
Ответы
Ответ 1
Нет. В Oracle операторы DDL сами по себе не являются транзакционными.
Выполнение инструкции DDL неявно фиксирует любую открытую транзакцию для этого сеанса до начала фактической работы.
Кроме того, некоторые операторы, такие как оператор alter table, могут потерпеть неудачу, если другой сеанс имеет открытую транзакцию для изменяемого объекта или одной из его зависимостей. Вы можете установить ddl_lock_timeout, чтобы указать, как долго вы хотите, чтобы Oracle ждал, пока объект станет доступным.
См. Отчеты DDL для краткого изложения типов операторов DDL и информации об их поведении в отношении блокировок и транзакций.
Ответ 2
DDL не является транзакционным в Oracle. Из 11.2 doc:
База данных Oracle неявно совершает текущую транзакцию до и после каждого оператора DDL.
Ответ 3
Просто обнаружил это, поэтому требуется больше исследований, но Oracle создать авторизацию схемы по крайней мере позволяет объединять несколько операторов DDL в одной транзакции, таким образом избегая нескольких коммитов и не гарантируя никаких побочных эффектов, т.е. откат, если какой-либо из операторов DDL терпит неудачу.
Неясно, применяется ли откат только для завернутых операторов DDL, поскольку, если в схеме создания была начата точка сохранения или внешняя транзакция, возможно, с каким-либо предыдущим выражением DML.
Вы по-прежнему не можете избежать фиксации после успешного завершения последнего завершенного оператора DDL.