powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Opacle, вложенные транзакции - как?
21 сообщений из 21, страница 1 из 1
Opacle, вложенные транзакции - как?
    #32182233
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я новичек в этом звере, так что заранее сорри за, может быть, глупый вопрос.
Хочется сделать примерно так:

begin -- block #1, start transaction #1
...
...
begin -- block #2, start transaction #2
...
commit;
end; -- block #2, end transaction #2
...
...
commit;
end; -- block #1, end transaction #2

Дык вот, вопрос: хочу, что бы, если бы я делал rollback для транзакции #1, то вложенная транзакция #2 тоже откатилась бы.
Смысл: скрипт очень большой и Оракл грит типа program too large.
Мысль: если коммитить все инсерты/апдейты по кускам, то по идее должно пройти...Во всяком случае, для MS SQL решение сработало...
Можно ли это сделать для Оракл и, если да, то как?
P.S. Документацию по Ораклу читал, описанные 2 способа решения проблемы "program too large" категорически не подходят.
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182339
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
чет мне кажется что танцы с commit к этой ошибке не имеет никакого отношения и никак не помогут...
а разбить скрипт на несколько не получится?
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182341
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне почему-то кажется, что твоя 1 транзакция закончится
при первом же коммите :-)
Если тебе нужна именно ВЛОЖЕННОСТЬ транзакций
используй
pragma AUTONOMOUS_TRANSACTION
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182347
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
are:
с MS SQL помогло. Когда все шло в одной транзакции, тоже вылетала ошибка по памяти. Теперь там это выглядит примерно так:

begin transaction T1
...
...
begin transaction T2
...
...
commit transaction T2
...
...
commit transaction T1

и работает как надо.

Oleg Afanasiev:
Совершенно верно, транзакция при первом коммите и заканчивается.
И это...я ж сказал выше - новис я в Оракл, плз, покажи пальцем как эту прагму заюзать.
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182353
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
ну у тебя же не ошибка по памяти...
вложенные транзакции тебе не помогут

у MSSQL транзакция очень емкая хрень по ресурсам - в Oracle так извращаться не надо... заканчивай транзакию тогда когда тебе это надо

autonomus transaction - нафига они тебе?
тебе ж наооборот надо после rollback откатывать все... а в случае автономной транзакции - автономная не откатится
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182355
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И это...вот чо нашел в доке:
Restriction: You cannot mark a nested PL/SQL block as autonomous.
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182356
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
и еще вопрос... в какой среде ты пытаешься выполнить свой скрипт?
SQLPlus?
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182357
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
are:
у меня именно ошибка по памяти! PLS-00123: program too large
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182358
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
are:
ага, в ем самом, в SQLPlus
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182359
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вобщем то вопрос был как сделать вложенные транзакции :-)

Ты описал проблему но не описал в каком контексте
ты это выполняешь.
Поэтому очень трудно понять что тебе нужно.
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182360
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
тут недавно ветка была: "как создать базу"\r
\r
/topic/35098\r
\r
там я пример кидал как базу создать с помощью sqlplus и скриптов...\r
попробуй всеж свой скрипт разбить на несколько
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182362
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
PLS-00123 program too large

Cause: PL/SQL was designed primarily for robust transaction processing. One consequence of the special-purpose design is that the PL/SQL compiler imposes a limit on block size. The limit depends on the mix of statements in the PL/SQL block. Blocks that exceed the limit cause this error.

Action: The best solution is to modularize the program by defining subprograms, which can be stored in an Oracle database. Another solution is to break the program into two sub-blocks. Have the first block INSERT any data the second block needs into a temporary database table. Then, have the second block SELECT the data from the table
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182371
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg Afanasiev:

Смысл такой: есть некая программуля, которая на основе темплейтов генерит скрипты для (в зависимости от указанных на вход опций) заполнения заранее известной базы данных. На вход этой программе подаются и описания данных.
Полученные скрипты в виде текстовых файлов могут быть потом ручками (или батчем - это неважно) загружены в соотвествующую программу (для MS - isql или Query Manager) и выполнены. Нужно написать соотвествующий темплейт для Oracle. Это, так сказать, отправная точка.
Таковой темплейт мною уже написан и нормально работает, но - не всегда :)
Если входное описание данных достаточно сложно-разветвленное, то полученный в результате скрипт не работает, а выдает ошибку по памяти.
Устройство этого скрипта такое:
begin -- main block
insert ... -- or update
insert ... -- or update
...
begin -- sub block
insert ... -- or update
insert ... -- or update
...
end; -- sub block
... -- continue main block
...
begin -- sub block
...
end; -- sub block
... -- ну и т.д.

commit;
exception
when others then rollback;
end;

Как я сказал выше - если таких сабблоков получилось много получаю ошибку памяти.
Вынести сабблок "наверх" ... не знаю, в сабблоке инсерт или апдейт производится в референцируемую таблицу, делать "в тупую" - будет нарушение констрейнта...На "делать по умному" не хватает знаний в Оракл.
Вот...ну что еще сказать? Как я уже писал, в при генерации в MS SQL была похожая проблема, решилась введением "вложенных" в сабблоки транзакций.
Использовать stored procedures нельзя по условию , "чтобы все было одинаково, как MS-базе".
Не знаю, понятно я написал?

are:
дык базу-то я создал, мне б в нее данные бы теперь загрузить...
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182373
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
are:
это я уже читал перед тем, как лезть к занятым людям со своими глупостями :) не помогло :)
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182375
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
скрипты выглядят как простые insert и update
или там есть еще какая-то логика?
насколько оправдано использование begin ... end?

может begin ... end выкинуть а оставить:

--блок1
insert...
insert..
insert...

--блок 2
insert...
insert..
insert...

ну и так далее


?
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182376
are
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
are
Гость
сорри за тупые вопросы... но мне всеже кажется что что-то здесь не то :)
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182378
mopemah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
are:
не, ничего, нормальные вопросы.
логика там есть и довольно таки не примитивная, тупым набором insert/update не обходится...
то, что здесь "что-то не то" я знаю давно, но тут вопрос к архитектору проекта :) ... продолжать тему архитектуры, извини, не буду, а то сорвусь на ненормативные выражения...
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32182440
__guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема скорее в размере блока pl/sql.
транзакции тут ни при чем.
или разбивай на несколько процедур pl/sql
(или несколько файлов, которые грузи через @@file.sql)
или грузи через sql loader
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32183514
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а тебе точно надо делать коммит в каждом блоке??
если в первых 5 был коммит, а в 6 ошибка
то как я понял ты хочешь чтобы выполнился в конце ролбэк
в таком варианте он ничего не откатит

чтобы не было ошибок
1. убедись что хватает ролбэк сегментов
2. можешь использовать процедуры с автономными транзакциями(если приспичило)
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32183740
Dikobrazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Вынести сабблок "наверх" ... не знаю, в сабблоке инсерт или апдейт производится в референцируемую таблицу, делать "в тупую" - будет нарушение констрейнта...На "делать по умному" не хватает знаний в Оракл.

В Оракле можно констрейн откладывать "на потом", если при его создании указано слово deferrable.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table tbl (id int primary key);

insert into tbl (id) values( 1 );

create table z_test
(n int,
 r int,
 constraint z_test_pk primary key (N),
 constraint z_test_fk FOREIGN KEY (R) REFERENCES tbl DEFERRABLE INITIALLY RELY);


set constraint z_test_fk deferred;  -- временно убираем ограничение
 

insert into z_test (n,r) values ( 1 ,- 1 );
update z_test set r= 1  where n= 1 ;

set constraint z_test_fk immediate; -- возвращаем на место


При commit'e constraint возвращается на место, и если какие-то данные не удовлетворяют, происходит rollback.
...
Рейтинг: 0 / 0
Opacle, вложенные транзакции - как?
    #32183866
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dikobrazz:

обратите внимание что на поле R лучше всего сразу сделать индекс,
а то при изменении любой строки в detail таблице будет лочиться весь мастер
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Opacle, вложенные транзакции - как?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]