powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вложенные транзакции
12 сообщений из 37, страница 2 из 2
Вложенные транзакции
    #40027464
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Ещё inner() может ... сделать commit.
.
за это убивать надо! Чтоб ты жил на одну зарплату! (с)

YouTube Video
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027536
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

SQL+ это хорошо понимает, поэтому там сделано как у меня - каждая DML команда изменения данных является "вложенной" транзакцией, чтоб результаты предыдущих команд не пропали.


Это не SQL*Plus. Необработанное исключение в анонимном PL/SQL блоке вызывает откат изменений в нём.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
drop table t1;
create table t1 (n number);

declare
  qry varchar2(32767) :=
'begin
  insert into t1 values (1+:v*100);
  if mod(:v, 10) in(2, 3)then commit; end if;
  insert into t1 values (2+:v*100);
  if mod(:v, 10) in(3, 5)then raise program_error; end if;
';
begin
  for i in 11..15 loop
    begin
      execute immediate qry||' end;' using i;
    exception when others then null;
    end;
  end loop;
  for i in 21..25 loop -- тут анонимный блок обрабатывает исключения
    execute immediate qry||' exception when others then null; end;' using i;
  end loop;
end;
/

select * from t1;



N комментарий11101211023120141202513011302: второй insert после commit отменён61401 эти insert не коммитили71402 но исключение на следующей итерации их не не отменило 150x: оба insert отменены. insert 140x в предыдущей итерации сохранился82101 далее исключения обрабатывались внутри анонимного PL/SQL блока92102 все insert сохранились102201112202122301132302142401152402162501172502
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027537
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
НеофитSQL
Ещё inner() может ... сделать commit.
.
за это убивать надо! Чтоб ты жил на одну зарплату! (с)

За
Код: plsql
1.
DROP DATABASE INCLUDING BACKUPS NOPROMPT;


кого убивать?
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027544
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab,


Вы возможно о другом.

Я про 22247130

В sql+, строчки

Код: plsql
1.
2.
3.
SQL> insert into tst values(5);

SQL> insert into tst values(null);



принадлежат одной транзакции, или двум разным?

По моему пониманию, одной.

Второй вопрос: почему exception во второй не откатывает всю транзакцию, удаляя (5)?

Думаю, sql+ делает savepoint перед исполнением каждой новой команды.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027545
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Думаю, sql+ делает savepoint перед исполнением каждой новой команды.

Это далеко не первый случай, когда Вы подменяете изучение документации измышлизмами.
https://docs.oracle.com/cd/B19306_01/server.102/b14220/transact.htm#:~:text=Statement-Level Rollback,is a statement-level rollback.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027547
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Statement-level rollback это превосходная штука для командной строки, но учтите следующее:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> truncate table test20;

Table truncated.

SQL> begin
  2    Inner(1,'one');
  3    Inner(0,'zero');
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-12899: value too large for column "EEK"."TEST20"."TEXT" (actual: 11,
maximum: 10)
ORA-06512: at "EEK.INNER", line 4
ORA-06512: at line 3


SQL> select * from test20;

no rows selected



Исходя из моего эксперимента, весь анонимный блок с многими insert внутри - это один statement.

Кстати, вы заметили неточность в определении начала транзакции в доке по ссылке? У оракла есть более точное определение в других местах, здесь они решили упростить.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027554
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Думаю, sql+ делает savepoint перед исполнением каждой новой команды.



SQL*Plus этого не делает. Это функция СУБД.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027555
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
mcureenab,

Код: plsql
1.
2.
3.
SQL> insert into tst values(5);

SQL> insert into tst values(null);



принадлежат одной транзакции, или двум разным?

По моему пониманию, одной.

Второй вопрос: почему exception во второй не откатывает всю транзакцию, удаляя (5)?



Вот этими вопросами рулит SQL*Plus.

1. Включи WHENEVER SQLERROR CONTINUE ROLLBACK, и исключение во втором insert откатит изменения первого.

2. Включи SET AUTOCOMMIT, и insert'ы окажутся в разных транзакциях.

А вот так чтобы не откатывать анонимный PL/SQL блок, такого нет.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027557
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Исходя из моего эксперимента, весь анонимный блок с многими insert внутри - это один statement.

https://docs.oracle.com/cd/E18283_01/appdev.112/e17126/overview.htm An anonymous block is a SQL statement.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027610
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Теперь это потребовалось, потому что она стала участвовать в бОльшей транзакции неопределенного размера.


rollback to не отпускает ждущие сессии
так что желательно завершить транзакцию как можно побыстрее

.....
stax
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027696
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL

Теперь это потребовалось, потому что она стала участвовать в бОльшей транзакции неопределенного размера.


rollback to не отпускает ждущие сессии
так что желательно завершить транзакцию как можно побыстрее

.....
stax


Возражений нет, вот только моя функция промежуточного слоя не управляет когда транзакция закончится. Rollback to это максимум что мне удастся сделать.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #40027701
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab
НеофитSQL

Думаю, sql+ делает savepoint перед исполнением каждой новой команды.



SQL*Plus этого не делает. Это функция СУБД.


А можно как-то эту функцию СУБД натравить на pl/sql код,и объявить определенную процедуру отдельным "statement", чтобы statement-level rollback относился к ней?

Я видел чьи-то надежды на PRAGMA NESTED_TRANSACTION в оракл коммюнити, но пока такого удобного механизма вроде не случилось.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вложенные транзакции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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