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

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
13.06.2003, 16:14:16
    #32182339
are
are
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
чет мне кажется что танцы с commit к этой ошибке не имеет никакого отношения и никак не помогут...
а разбить скрипт на несколько не получится?
...
Рейтинг: 0 / 0
13.06.2003, 16:18:34
    #32182341
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
Мне почему-то кажется, что твоя 1 транзакция закончится
при первом же коммите :-)
Если тебе нужна именно ВЛОЖЕННОСТЬ транзакций
используй
pragma AUTONOMOUS_TRANSACTION
...
Рейтинг: 0 / 0
13.06.2003, 16:30:32
    #32182347
mopemah
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
are:
с MS SQL помогло. Когда все шло в одной транзакции, тоже вылетала ошибка по памяти. Теперь там это выглядит примерно так:

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

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

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

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

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

Ты описал проблему но не описал в каком контексте
ты это выполняешь.
Поэтому очень трудно понять что тебе нужно.
...
Рейтинг: 0 / 0
13.06.2003, 16:40:20
    #32182360
are
are
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
тут недавно ветка была: "как создать базу"\r
\r
/topic/35098\r
\r
там я пример кидал как базу создать с помощью sqlplus и скриптов...\r
попробуй всеж свой скрипт разбить на несколько
...
Рейтинг: 0 / 0
13.06.2003, 16:44:17
    #32182362
are
are
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
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
13.06.2003, 17:07:19
    #32182371
mopemah
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
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
13.06.2003, 17:09:08
    #32182373
mopemah
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
are:
это я уже читал перед тем, как лезть к занятым людям со своими глупостями :) не помогло :)
...
Рейтинг: 0 / 0
13.06.2003, 17:14:58
    #32182375
are
are
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
скрипты выглядят как простые insert и update
или там есть еще какая-то логика?
насколько оправдано использование begin ... end?

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

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

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

ну и так далее


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

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

В Оракле можно констрейн откладывать "на потом", если при его создании указано слово 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
17.06.2003, 10:18:53
    #32183866
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Opacle, вложенные транзакции - как?
2Dikobrazz:

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


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