Функция parent
возвращает другую функцию. Эта функция должна вызываться для вступления в силу:
print(parent()())
Или, чтобы подчеркнуть последовательность вызова:
print((parent())()
Нет, он всегда будет фиксироваться.
Если вы хотите выполнить откат, вам придется сделать это раньше DDL.
Если вы хотите изолировать DDL от существующей транзакции, вам придется выполнять ее в отдельной отдельной транзакции.
Технически DDL делает коммит ДО того, как он выполнит и ПОСЛЕ того, как он выполнит.
Да, та же ссылка из Cookie, но это другой аспект той же проблемы. Важно понимать, что это не просто один коммит, а два, и они происходят как до, так и после.
Actually it will commit IF IT CAN. If it can't successfully commit, the DDL will fail. One way to stop it committing is have a deferred constraint violated.
create table fred (id number);
alter table fred add constraint id_ck check (id >0) initially deferred;
insert into fred values (-1);
SQL> create table junk(val number);
create table junk(val number)
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (GC_REF.ID_CK) violated
SQL> desc junk
ERROR:
ORA-04043: object junk does not exist
So if you want to prevent an implicit commit, have a dummy table with a deferred constraint. Insert a violating row in it, and you can make sure the transaction can't be committed until that violation is resolved (eg row deleted).
Усеченная таблица или таблица изменений или create table всегда вызывает фиксацию.
Почему вы хотите выполнить откат, когда выполняете усеченную таблицу?
Вот статья AskTom, которая может помочь. Из статьи:
«Мне было интересно, почему операторы DDL не выполняются внутри автономной транзакции (как это делают последовательности), чтобы они не влияли на какие-либо ожидающие транзакции пользователя ...
Вы можете уточнить?
Продолжение 24 июня 2003 г. - 7 часов утра США / Восток:
это было бы так же "запутанно", как не делать этого таким образом. В любом случае, у вас есть атран, так что если хотите, можете »
. действительно нужно, вы можете вставить свой DDL в автономную транзакцию и делать то, что хотите.
РЕДАКТИРОВАТЬ: Суть в том, что, если вы не перейдете на явную длину, чтобы "ниспровергнуть" Oracle, DDL выполнит фиксацию. Тем не менее, если вам абсолютно необходимо, чтобы фиксация выполнялась в определенный момент, почему бы просто не выполнить ее явно?