|
|
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
Я новичек в этом звере, так что заранее сорри за, может быть, глупый вопрос. Хочется сделать примерно так: 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" категорически не подходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 13:06:56 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
чет мне кажется что танцы с commit к этой ошибке не имеет никакого отношения и никак не помогут... а разбить скрипт на несколько не получится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:14:16 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
Мне почему-то кажется, что твоя 1 транзакция закончится при первом же коммите :-) Если тебе нужна именно ВЛОЖЕННОСТЬ транзакций используй pragma AUTONOMOUS_TRANSACTION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:18:34 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
are: с MS SQL помогло. Когда все шло в одной транзакции, тоже вылетала ошибка по памяти. Теперь там это выглядит примерно так: begin transaction T1 ... ... begin transaction T2 ... ... commit transaction T2 ... ... commit transaction T1 и работает как надо. Oleg Afanasiev: Совершенно верно, транзакция при первом коммите и заканчивается. И это...я ж сказал выше - новис я в Оракл, плз, покажи пальцем как эту прагму заюзать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:30:32 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
ну у тебя же не ошибка по памяти... вложенные транзакции тебе не помогут у MSSQL транзакция очень емкая хрень по ресурсам - в Oracle так извращаться не надо... заканчивай транзакию тогда когда тебе это надо autonomus transaction - нафига они тебе? тебе ж наооборот надо после rollback откатывать все... а в случае автономной транзакции - автономная не откатится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:35:24 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
И это...вот чо нашел в доке: Restriction: You cannot mark a nested PL/SQL block as autonomous. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:35:53 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
и еще вопрос... в какой среде ты пытаешься выполнить свой скрипт? SQLPlus? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:36:45 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
are: у меня именно ошибка по памяти! PLS-00123: program too large ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:37:32 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
are: ага, в ем самом, в SQLPlus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:38:26 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
Ну вобщем то вопрос был как сделать вложенные транзакции :-) Ты описал проблему но не описал в каком контексте ты это выполняешь. Поэтому очень трудно понять что тебе нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:39:02 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
тут недавно ветка была: "как создать базу"\r \r /topic/35098\r \r там я пример кидал как базу создать с помощью sqlplus и скриптов...\r попробуй всеж свой скрипт разбить на несколько ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:40:20 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 16:44:17 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
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: дык базу-то я создал, мне б в нее данные бы теперь загрузить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 17:07:19 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
are: это я уже читал перед тем, как лезть к занятым людям со своими глупостями :) не помогло :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 17:09:08 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
скрипты выглядят как простые insert и update или там есть еще какая-то логика? насколько оправдано использование begin ... end? может begin ... end выкинуть а оставить: --блок1 insert... insert.. insert... --блок 2 insert... insert.. insert... ну и так далее ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 17:14:58 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
сорри за тупые вопросы... но мне всеже кажется что что-то здесь не то :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 17:16:19 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
are: не, ничего, нормальные вопросы. логика там есть и довольно таки не примитивная, тупым набором insert/update не обходится... то, что здесь "что-то не то" я знаю давно, но тут вопрос к архитектору проекта :) ... продолжать тему архитектуры, извини, не буду, а то сорвусь на ненормативные выражения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 17:20:17 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
проблема скорее в размере блока pl/sql. транзакции тут ни при чем. или разбивай на несколько процедур pl/sql (или несколько файлов, которые грузи через @@file.sql) или грузи через sql loader ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2003, 21:31:19 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
а тебе точно надо делать коммит в каждом блоке?? если в первых 5 был коммит, а в 6 ошибка то как я понял ты хочешь чтобы выполнился в конце ролбэк в таком варианте он ничего не откатит чтобы не было ошибок 1. убедись что хватает ролбэк сегментов 2. можешь использовать процедуры с автономными транзакциями(если приспичило) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2003, 17:31:04 |
|
||
|
Opacle, вложенные транзакции - как?
|
|||
|---|---|---|---|
|
#18+
> Вынести сабблок "наверх" ... не знаю, в сабблоке инсерт или апдейт производится в референцируемую таблицу, делать "в тупую" - будет нарушение констрейнта...На "делать по умному" не хватает знаний в Оракл. В Оракле можно констрейн откладывать "на потом", если при его создании указано слово deferrable. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. При commit'e constraint возвращается на место, и если какие-то данные не удовлетворяют, происходит rollback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2003, 04:07:41 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32182347&tid=1989996]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
172ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 183ms |
| total: | 428ms |

| 0 / 0 |
