|
|
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elic Код: plsql 1. Надо знать, где на самом деле начинается автономка: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 21:09 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ... andrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась. andrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN, что ты ещё раз и показал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 21:41 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ... Не аргумент. В доке есть про то, что автономная транзакция автономна. И нет про то, что секция declare работает в контексте родительской транзакции. Как минимум, это не очевидно. Сталбыть, если "так задумано" - то должно было быть документировано. А если не задумано - то это либо баг, либо багофича, т.е. поведение может измениться без предупреждения. Как-то так. Elicandrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась. Не принимаю. Во всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке. А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads. Elicandrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN То ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно. Я для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят. И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 23:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous... Во всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке. А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads. ... Мне бы не хотелось втягиваться в терминологические споры по поводу определения того, что такое "грязное" и "чистое", но, если уж вообще пользоваться такой терминологией, то грязными я бы называл здесь записи именно внутри тела автономной процедуры порожденные. Именно что курсор открыт до начала того бегина, который изолирует контекст вложенной, рекурсивной подтранзакции. Значит, ему по документации, толкующей об изолированности автономной транзакции, положено не видеть записей, порождаемых после прохождения "точки изоляции", а он успешно видит их сплошь, по сути - в едином контексте. То, что что точка изоляции проходит по бегину это одна история - про то, что в автономную транзакцию таки можно передавать информацию о состоянии порождающей транзакции. Само по себе это спорный повод для утверждений про грязное чтение. А то, что курсор, открытый до прохождения этой точки успешно видит происходящее после нее - другая, история про то, что для такого (открытого до границы начала рекурсивной транзакции) курсора контекст в действительности един. Насчет поведение изменится в будущем. Для того, чтобы на это рассчитывать, нужно ясное понимание того, что же в этой истории является очевидным багом. Я вот не готов сказать, что он здесь есть и требует исправления. Исправления, имхо, требует текст документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 02:10 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousИ нет про то, что секция declare работает в контексте родительской транзакции. Как минимум, это не очевидно.Это да. andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке.Не важно, где он читается. Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама. andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов. Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался. andrey_anonymousТо ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно.Нет. Непросто, потому что начинается с BEGIN. andrey_anonymousЯ для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят. И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge.Мне эта тема не интересна в практическом плане: в нормальном коде у нормального разработчика подобная "неоднозначность" просто не должна возникать. Да и, как можно заметить, информация предназначалась не совсем тебе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 08:07 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousВо всех вариантах курсор ... Но читается - в автономке.Не важно, где он читается. Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама. andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов. Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался. Примени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов. Тот факт, что фича давно известная, сути явления не меняет - Oracle допускает грязные чтения посредством передачи открытого курсора в автономную транзакцию. На тему "не должна встречаться в коде нормального разработчика" - это как посмотреть. В принципе, инициализация переменных в declare сама по себе не криминал. Ты вот наткнулся когда-то на то, что в узкоспециальном случае секция declare автономной транзакции выполнится в контексте родительской, я - нет. И сколько разрабов еще не наткнулись - вопрос. Несложно предположить, что кто-то инциализирует курсорные переменные в declare - с риском получить неконсистентные данные ввиду недокументированного поведения системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 10:42 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке. А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.этак ты договоришься, что в приложении один поток работает с одной транзакцией, другой с другой - грязное чтение. Это не чтение грязное, а некорректная работа с транзакциями. А может и корректная, например для логирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 12:17 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
грязная записьэтак ты договоришься Эт вряд ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 12:45 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
грязная запись, он прав. тут ведь "грязное" чтение имеется в виду не в морально-этическом смысле. это просто такой термин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 15:45 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 02:02 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Кстати, и стандартная дока в картинках показывает где именно замораживается родительская и стартует автономная транзакция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 06:12 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров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.Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 07:56 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНа 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 и можно не особо опасаться изменений в поведении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:10 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Следующее сообщение еще не посмотрел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:15 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousПримени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов. А еслиб ты эти данные передал параметром (ну скажем в виде коллекции), то ты бы тоже называл это "грязным чтением"? Просто Элик различает неявную передачу параметров, через declare и грязные чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:56 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Почитав ветку нашел "вопрос для собеседования". Предсказать результат запроса: Код: plsql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:08 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, для окончательного выноса мозга еще и Код: plsql 1. добавить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:12 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровСледующее сообщение еще не посмотрел? Посмотрел. Не согласен, что тема освещена. В ноте - да, в доке - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:27 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевА еслиб Сергей, если бы у бабушки был член - она была бы дедушкой. В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов. По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads. Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСергей АрсеньевА еслиб Сергей, если бы у бабушки был член - она была бы дедушкой. В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов. По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads. Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать.А если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch? Есть же, к примеру, ORA-08177 Can't serialize access for this transaction On index Block splits ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:53 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousВячеслав ЛюбомудровСледующее сообщение еще не посмотрел? Посмотрел. Не согласен, что тема освещена. В ноте - да, в доке - нет.На картинке какие-то непонятки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:54 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
ORA__SQLА если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch? А он меняется? Судя по тому, что возвращает - нет. Курсор работает в той транзакции, которая его создала. Меняется только не совсем явное построение туннеля для передачи результата в новую транзакцию. Механизм передачи данных из одной транзакции в другую в обход (в т.ч. в виде параметров, dbms_pipe и пр.) в любом случае нарушает изоляцию транзакций. Просто это не считается за dirty reads. Вот если б этот курсор начал читать еще и назакомиченные данные вставленные в автономке - вот тогда был бы dirty reads. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
[quot Сергей Арсеньев]ORA__SQLА он меняется? XID же другой. Запрещать или нет делать fetch при новом xid - это вопрос. Сергей АрсеньевКурсор работает в той транзакции, которая его создала.У курсора есть два этапа: open и fetch. Открыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции. Результат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра. А бы сделал такой вывод: не важно, когда и при каких условиях мы делаем fetch. Фаза open всегда определяет содержимое курсора. При каких условиях открыли, то и получили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:08 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:50 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНа картинке какие-то непонятки? На картинке в declare ничего транзакционного нет - сделать вывод о работе секции declare в контексте основной транзакции даже по отдельно взятой картинке очень сложно, а вместе с текстом - невозможно, поскольку в тексте заявлено, что прагма действует на pl/sql unit, а не на часть его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:28 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39356516&tid=1886876]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 465ms |

| 0 / 0 |
