powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
25 сообщений из 143, страница 3 из 6
Функция length
    #39355547
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Код: plsql
1.
'Unexpected dirty reads (cursor opened in autonomous DECLARE):'

Надо знать, где на самом деле начинается автономка: Entering and Exiting Autonomous Transactions

На docs.oracle.com плиз ссылку, а не на квизы всякие :)

А dirty зря выделил - оно именно dirty для автономки, которая курсор читает.

Что до темы "где начинается", то все просто:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
create sequence ane_tdirt_seq;
 
Sequence created

create table ane_tdirt( seq_no integer default ane_tdirt_seq.nextval
                      , call_path varchar2(1000)
                      , x_id varchar2(100)
                      , callstack varchar2(4000));
 
Table created

declare
  lv varchar2(100);
  function fix_context(i_tag varchar2) return varchar2 is
  begin
    insert into ane_tdirt(call_path, x_id, callstack) values (i_tag, dbms_transaction.local_transaction_id, dbms_utility.format_call_stack);
    return null;
  end;
 
  function autonomous_f(tag varchar2, d number default 1) return varchar2 is pragma autonomous_transaction;
    lv varchar2(100) := fix_context (tag||'->aDecl('||d||')');
    lz varchar2(100) := case when d>0 then autonomous_f(tag||'->aDecl('||d||')', d-1) end;
  begin
    --pragma inline(fix_context,'YES');
    lv := fix_context(tag||'->aBody('||d||')');
    if d > 0 then lv := autonomous_f(tag||'->aBody('||d||')', d-1); end if;
    commit;
    return null;
  end;
begin
  lv := fix_context('parent');
  lv := autonomous_f('parent');
  commit;
end;
/
 
PL/SQL procedure successfully completed
select * from ane_tdirt;
 
SEQ_NO CALL_PATH                      X_ID            CALLSTACK
------ ------------------------------ --------------- --------------------------------------------------------------------------------
     1 parent                         15.29.1165      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        21  anonymous block
 
     2 parent->aDecl(1)               15.29.1165      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        11  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     3 parent->aDecl(1)->aDecl(0)     15.29.1165      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        11  anonymous block
                                                      0x72676dd0        12  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     4 parent->aDecl(1)->aBody(0)     12.8.1175       ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        15  anonymous block
                                                      0x72676dd0        12  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     5 parent->aBody(1)               13.1.1221       ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        15  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     6 parent->aBody(1)->aDecl(0)     13.1.1221       ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        11  anonymous block
                                                      0x72676dd0        16  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     7 parent->aBody(1)->aBody(0)     16.25.1215      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        15  anonymous block
                                                      0x72676dd0        16  anonymous block
                                                      0x72676dd0        22  anonymous block
 
 
7 rows selected

drop table ane_tdirt purge;
 
Table dropped

drop sequence ane_tdirt_seq;
 
Sequence dropped

...
Рейтинг: 0 / 0
Функция length
    #39355558
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ...
andrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась.
andrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN, что ты ещё раз и показал.
...
Рейтинг: 0 / 0
Функция length
    #39355593
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ...
Не аргумент.
В доке есть про то, что автономная транзакция автономна.
И нет про то, что секция declare работает в контексте родительской транзакции.
Как минимум, это не очевидно.
Сталбыть, если "так задумано" - то должно было быть документировано.
А если не задумано - то это либо баг, либо багофича, т.е. поведение может измениться без предупреждения.
Как-то так.

Elicandrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась.
Не принимаю.
Во всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.
А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.

Elicandrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN
То ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно.
Я для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят.
И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge.
...
Рейтинг: 0 / 0
Функция length
    #39355634
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous...
Во всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.
А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.
...

Мне бы не хотелось втягиваться в терминологические споры по поводу определения того, что такое "грязное" и "чистое", но, если уж вообще пользоваться такой терминологией,
то грязными я бы называл здесь записи именно внутри тела автономной процедуры порожденные.

Именно что курсор открыт до начала того бегина, который изолирует контекст вложенной, рекурсивной подтранзакции.
Значит, ему по документации, толкующей об изолированности автономной транзакции, положено не видеть записей, порождаемых после прохождения "точки изоляции", а он успешно видит их сплошь, по сути - в едином контексте.

То, что что точка изоляции проходит по бегину это одна история - про то, что в автономную транзакцию таки можно передавать информацию о состоянии порождающей транзакции.
Само по себе это спорный повод для утверждений про грязное чтение.

А то, что курсор, открытый до прохождения этой точки успешно видит происходящее после нее - другая, история про то, что для такого (открытого до границы начала рекурсивной транзакции) курсора контекст в действительности един.

Насчет поведение изменится в будущем.
Для того, чтобы на это рассчитывать, нужно ясное понимание того, что же в этой истории является очевидным багом.
Я вот не готов сказать, что он здесь есть и требует исправления.
Исправления, имхо, требует текст документации.
...
Рейтинг: 0 / 0
Функция length
    #39355692
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousИ нет про то, что секция declare работает в контексте родительской транзакции.
Как минимум, это не очевидно.Это да.
andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.Не важно, где он читается.
Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама.
andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов.
Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался.
andrey_anonymousТо ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно.Нет. Непросто, потому что начинается с BEGIN.
andrey_anonymousЯ для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят.
И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge.Мне эта тема не интересна в практическом плане: в нормальном коде у нормального разработчика подобная "неоднозначность" просто не должна возникать.
Да и, как можно заметить, информация предназначалась не совсем тебе.
...
Рейтинг: 0 / 0
Функция length
    #39355773
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymousВо всех вариантах курсор ... Но читается - в автономке.Не важно, где он читается.
Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама.
andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов.
Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался.

Примени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов.
Тот факт, что фича давно известная, сути явления не меняет - Oracle допускает грязные чтения посредством передачи открытого курсора в автономную транзакцию.

На тему "не должна встречаться в коде нормального разработчика" - это как посмотреть.
В принципе, инициализация переменных в declare сама по себе не криминал.
Ты вот наткнулся когда-то на то, что в узкоспециальном случае секция declare автономной транзакции выполнится в контексте родительской, я - нет. И сколько разрабов еще не наткнулись - вопрос.
Несложно предположить, что кто-то инциализирует курсорные переменные в declare - с риском получить неконсистентные данные ввиду недокументированного поведения системы.
...
Рейтинг: 0 / 0
Функция length
    #39355857
andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.
А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.этак ты договоришься, что в приложении один поток работает с одной транзакцией, другой с другой - грязное чтение.
Это не чтение грязное, а некорректная работа с транзакциями. А может и корректная, например для логирования.
...
Рейтинг: 0 / 0
Функция length
    #39355883
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грязная записьэтак ты договоришься
Эт вряд ли.
...
Рейтинг: 0 / 0
Функция length
    #39356062
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грязная запись,

он прав. тут ведь "грязное" чтение имеется в виду не в морально-этическом смысле.
это просто такой термин.
...
Рейтинг: 0 / 0
Функция length
    #39356472
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousElicпропущено...
Надо знать, где на самом деле начинается автономка: Entering and Exiting Autonomous Transactions

На docs.oracle.com плиз ссылку, а не на квизы всякие :)
Oracle 8.1.5 and higher : Autonomous Transactions (Doc ID 65961.1)The parent (or main) transaction remains active while any
statements specified in the declare section of the autonomous unit
are executed.
...
Рейтинг: 0 / 0
Функция length
    #39356504
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, и стандартная дока в картинках показывает где именно замораживается родительская и стартует автономная транзакция
...
Рейтинг: 0 / 0
Функция length
    #39356516
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровOracle 8.1.5 and higher : Autonomous Transactions (Doc ID 65961.1)The parent (or main) transaction remains active while any
statements specified in the declare section of the autonomous unit
are executed.Спасибо.
...
Рейтинг: 0 / 0
Функция length
    #39356546
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНа docs.oracle.com плиз ссылку, а не на квизы всякие :)
Oracle 8.1.5 and higher : Autonomous Transactions (Doc ID 65961.1)The parent (or main) transaction remains active while any
statements specified in the declare section of the autonomous unit
are executed.[/quot]
Спасибо, Вячеслав.
Сталбыть, это documentation bug и можно не особо опасаться изменений в поведении.
...
Рейтинг: 0 / 0
Функция length
    #39356553
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующее сообщение еще не посмотрел?
...
Рейтинг: 0 / 0
Функция length
    #39356575
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousПримени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов.
А еслиб ты эти данные передал параметром (ну скажем в виде коллекции), то ты бы тоже называл это "грязным чтением"?
Просто Элик различает неявную передачу параметров, через declare и грязные чтения.
...
Рейтинг: 0 / 0
Функция length
    #39356584
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитав ветку нашел "вопрос для собеседования".
Предсказать результат запроса:
Код: plsql
1.
2.
3.
4.
with t as (select level id from dual connect by level<10)
select * from (
select cast((collect(id) over (order by id desc)) as sys.odcinumberlist) from t
) where rownum=1
...
Рейтинг: 0 / 0
Функция length
    #39356587
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

для окончательного выноса мозга еще и
Код: plsql
1.
partition by mod(id,2)


добавить
...
Рейтинг: 0 / 0
Функция length
    #39356595
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСледующее сообщение еще не посмотрел?
Посмотрел.
Не согласен, что тема освещена.
В ноте - да, в доке - нет.
...
Рейтинг: 0 / 0
Функция length
    #39356600
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевА еслиб
Сергей, если бы у бабушки был член - она была бы дедушкой.
В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов.
По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads.
Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать.
...
Рейтинг: 0 / 0
Функция length
    #39356619
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousСергей АрсеньевА еслиб
Сергей, если бы у бабушки был член - она была бы дедушкой.
В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов.
По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads.
Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать.А если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch?
Есть же, к примеру, ORA-08177 Can't serialize access for this transaction On index Block splits
...
Рейтинг: 0 / 0
Функция length
    #39356620
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВячеслав ЛюбомудровСледующее сообщение еще не посмотрел?
Посмотрел.
Не согласен, что тема освещена.
В ноте - да, в доке - нет.На картинке какие-то непонятки?
...
Рейтинг: 0 / 0
Функция length
    #39356653
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLА если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch?
А он меняется?
Судя по тому, что возвращает - нет. Курсор работает в той транзакции, которая его создала.
Меняется только не совсем явное построение туннеля для передачи результата в новую транзакцию.
Механизм передачи данных из одной транзакции в другую в обход (в т.ч. в виде параметров, dbms_pipe и пр.) в любом случае нарушает изоляцию транзакций.
Просто это не считается за dirty reads. Вот если б этот курсор начал читать еще и назакомиченные данные вставленные в автономке - вот тогда был бы dirty reads.
...
Рейтинг: 0 / 0
Функция length
    #39356718
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Сергей Арсеньев]ORA__SQLА он меняется?
XID же другой. Запрещать или нет делать fetch при новом xid - это вопрос.
Сергей АрсеньевКурсор работает в той транзакции, которая его создала.У курсора есть два этапа: open и fetch.
Открыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции.
Результат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра.
А бы сделал такой вывод: не важно, когда и при каких условиях мы делаем fetch.
Фаза open всегда определяет содержимое курсора. При каких условиях открыли, то и получили.
...
Рейтинг: 0 / 0
Функция length
    #39356756
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SANDBOX@ee>;create table t1 as select 1 a from dual;

Table created.

SANDBOX@ee>;var c refcursor;
SANDBOX@ee>;begin open :c for select * from t1; end;
  2  /

PL/SQL procedure successfully completed.

SANDBOX@ee>;drop table t1;

Table dropped.

SANDBOX@ee>;print c;
         A
----------
         1
...
Рейтинг: 0 / 0
Функция length
    #39356868
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНа картинке какие-то непонятки?
На картинке в declare ничего транзакционного нет - сделать вывод о работе секции declare в контексте основной транзакции даже по отдельно взятой картинке очень сложно, а вместе с текстом - невозможно, поскольку в тексте заявлено, что прагма действует на pl/sql unit, а не на часть его.
...
Рейтинг: 0 / 0
25 сообщений из 143, страница 3 из 6
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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