Операторы DDL всегда дают Вам неявную фиксацию, или можно ли получить неявный откат?

Функция parent возвращает другую функцию. Эта функция должна вызываться для вступления в силу:

print(parent()())

Или, чтобы подчеркнуть последовательность вызова:

print((parent())()
15
задан Lukasz Szozda 13 March 2018 в 15:58
поделиться

5 ответов

Нет, он всегда будет фиксироваться.

Если вы хотите выполнить откат, вам придется сделать это раньше DDL.

Если вы хотите изолировать DDL от существующей транзакции, вам придется выполнять ее в отдельной отдельной транзакции.

17
ответ дан 1 December 2019 в 00:33
поделиться

Технически DDL делает коммит ДО того, как он выполнит и ПОСЛЕ того, как он выполнит.

Да, та же ссылка из Cookie, но это другой аспект той же проблемы. Важно понимать, что это не просто один коммит, а два, и они происходят как до, так и после.

16
ответ дан 1 December 2019 в 00:33
поделиться

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).

6
ответ дан 1 December 2019 в 00:33
поделиться

Усеченная таблица или таблица изменений или create table всегда вызывает фиксацию.

Почему вы хотите выполнить откат, когда выполняете усеченную таблицу?

3
ответ дан 1 December 2019 в 00:33
поделиться

Вот статья AskTom, которая может помочь. Из статьи:

«Мне было интересно, почему операторы DDL не выполняются внутри автономной транзакции (как это делают последовательности), чтобы они не влияли на какие-либо ожидающие транзакции пользователя ...

Вы можете уточнить?

Продолжение 24 июня 2003 г. - 7 часов утра США / Восток:

это было бы так же "запутанно", как не делать этого таким образом. В любом случае, у вас есть атран, так что если хотите, можете »

. действительно нужно, вы можете вставить свой DDL в автономную транзакцию и делать то, что хотите.

РЕДАКТИРОВАТЬ: Суть в том, что, если вы не перейдете на явную длину, чтобы "ниспровергнуть" Oracle, DDL выполнит фиксацию. Тем не менее, если вам абсолютно необходимо, чтобы фиксация выполнялась в определенный момент, почему бы просто не выполнить ее явно?

3
ответ дан 1 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: