|
|
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевПросто это не считается за dirty reads. Кем не считается и почему? ORA__SQLРезультат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра. Именно в этом варианте, на мой взгляд, нельзя было бы говорить о dirty reads, поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:36 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousORA__SQLРезультат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра.Именно в этом варианте, на мой взгляд, нельзя было бы говорить о dirty reads, поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр).Так и нет же никакой разницы передать через параметр или сделать fetch. Фаза fetch вообще оторвана от транзакции и всего остального. Просто вычитывается ранее сохраненный результат. Что собственно и верно. Иначе была полная неразбериха. Из-за open-fetch вся путаница. Сделать через for cur in (select * from) loop end loop; не получится. Так что за уши притянутый случай. dirty reads нет и быть не может. А вот то, что autonomous_transaction начинается с BEGIN - важный нюанс раскопали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:54 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
ORA__SQLОткрыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции. Ну и чем это отличается от чтения в транзакции A и отправки результатов в транзакцию B xthtp dbms_pipe. Ну или совсем простом случае - передачи информации из row level триггера автономно работающей процедуре, которая сохранит их в журнал. Ни чем. И в том и в другом случае нарушение изоляции. Осознанное и управляемое. Главное, чтоб сам курсор не запутался в том, данные какой транзакции он читает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:56 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр). А здесь ты передаешь данные через переменную. Очень гигантская разница. SQL машина работает в одной транзакции и передает данные в PL/SQL, работающий в другой. Никто из них dirty reads не делает. Межтранзакционное взаимодействие есть, оно нарушает ACID. P.S. Хочешь dirty reads - делай дамп блока и парси ручками. Такой механизм в Oracle есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:04 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевandrey_anonymous поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр). А здесь ты передаешь данные через переменную. Очень гигантская разница. Вообще-то разница существенная. Для переданных извне данных никто нигде не гарантировал корректность. Поэтому разработчики обычно проверяют переданные извне параметры. Чуть более дискуссионный вопрос - о заранее открытом глобальном курсоре. Адекватный разработчик понимает, что данные в этом курсоре могут быть не консистентны с состоянием базы, в котором работает его транзакция - т.е. он может столкнуться с феноменами нарушения изоляции, в т.ч. с dirty reads, phantom reads. И называет эти явления своими именами , а не "не считается". Ну и собственно для меня тема диспута - не в dirty как таковых (предсказуемо, управляемо, может быть полезно), а в том, что разработчик, написавший ( на основании документации ) код вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. вообще говоря , вправе ожидать, что курсор откроется в контексте автономной транзакции. Но ввиду недокументированного поведения (судя по ноте - documentation bug) может не просто попасть на неприятности, но и обнаружить их на очень-очень позднем этапе. И хорошо еще, если автономка используется для целей логирования. Как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:27 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousнаписавший ( на основании документации ) код вида: Код: plsql 1. 2. вообще говоря, вправе ожидать, что курсор откроется в контексте автономной транзакции.А если такой: Код: plsql 1. 2. Его ожидания имеют права отличаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:51 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
ElicА если такой: Код: plsql 1. 2. Его ожидания имеют права отличаться? Почитаем доку вместе? https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm AUTONOMOUS_TRANSACTION Pragma ... PRAGMA Signifies that the statement is a pragma (compiler directive). Pragmas are processed at compile time, not at run time . They pass information to the compiler. Usage Notes You can apply this pragma to: Top-level (not nested) anonymous PL/SQL blocks Local, standalone, and packaged functions and procedures Methods of a SQL object type Database triggers Таким образом имеем: - прагма работает в момент компиляции - применяется к pl/sql unit-у целиком. Следствие: нет оснований ожидать различий в поведении успешно скомпилированного кода в зависимости от положения pragma autonomous_transaction. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:58 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
[quot andrey_anonymous]ElicА если такой:[/src] https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm AUTONOMOUS_TRANSACTION Pragma ... PRAGMA В доке по 12с немного переформулировали, но суть не поменялась: https://docs.oracle.com/database/121/LNPLS/autotransaction_pragma.htm#LNPLS01302 The AUTONOMOUS_TRANSACTION pragma marks a routine as autonomous ; that is, independent of the main transaction. In this context, a routine is one of these: Schema-level (not nested) anonymous PL/SQL block Standalone, package, or nested subprogram Method of an ADT Noncompound trigger ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:01 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Но там в принципе и словесное описание картинки: Entering and Exiting When you enter the executable section of an autonomous routine, the main transaction suspends. When you exit the routine, the main transaction resumes. И по поводу executable section: A PL/SQL block is defined by the keywords DECLARE, BEGIN, EXCEPTION, and END. These keywords divide the block into a declarative part, an executable part, and an exception-handling part. Only the executable part is required. A block can have a label. Example 1-1 shows the basic structure of a PL/SQL block. For syntax details, see "Block". Example 1-1 PL/SQL Block Structure << label >> (optional) DECLARE -- Declarative part (optional) -- Declarations of local types, variables, & subprograms BEGIN -- Executable part (required) -- Statements (which can use items declared in declarative part) [EXCEPTION -- Exception-handling part (optional) -- Exception handlers for exceptions (errors) raised in executable part] END; Вроде, как бы документировано, не? Regards Maxim ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:09 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Maxim Demenkoandrey_anonymous, Но там в принципе и словесное описание картинки: Entering and Exiting When you enter the executable section of an autonomous routine, the main transaction suspends. When you exit the routine, the main transaction resumes. Здесь задокументировано лишь то, что "main transaction suspends". Прямого указания на то, что declare выполняется именно в контексте main transaction, нет. А это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:19 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевПочитав ветку нашел "вопрос для собеседования". Предсказать результат запроса: Код: plsql 1. 2. 3. 4. так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен если убрять where rownum=1, у Вас работает? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:20 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousА это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".Тебе не надоело бессмысленно спорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:21 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousА это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".Тебе не надоело бессмысленно спорить? Не бессмысленно. Я в ходе дискуссии я полностью определился в своем отношении к обсуждаемому явлению (autonomous declare). До ссылки на нотку это был забавный недокументированный побочный эффект с непонятным будущим, после ссылки на нотку я склонился к версии о баге в документации. А в целом - мне кажется, что тема полностью раскрыта. Всем спасибо за участие, особенно Elicу и Владимиру Любомудрову за любезно предоставленные ссылки и квалифицированное оппонирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСергей Арсеньевпропущено... А здесь ты передаешь данные через переменную. Очень гигантская разница. Вообще-то разница существенная. Для переданных извне данных никто нигде не гарантировал корректность. И тут ты передаешь извне через переменную к которой есть общий доступ. То, что эта переменная позволяет дергать SQL машину в другой транзакции вполне ожидаемое поведение. Но это не означает, что происходит грязное чтение - происходит именно межтранзакционное взаимодействие. Заданное (хотя возможно и неожиданно) программистом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:00 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..если убрять where rownum=1, у Вас работает? Поработает, поработает и прибивает серверный процесс... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:02 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен Это то пол беды, у меня результат - массив с одним элементом, а не с 9, как в случае без order by (который не падает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:03 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. sqlplusCAST((COLLECT(ID)OVER(PARTITIONBYMOD(ID,2)))ASSYS.ODCINUMBERLIST) -------------------------------------------------------------------------------- SYS.ODCINUMBERLIST(2,8,6,4) CAST((COLLECT(ID)OVER(PARTITIONBYMOD(ID,2)ORDERBYIDDESC))ASSYS.ODCINUMBERLIST) -------------------------------------------------------------------------------- SYS.ODCINUMBERLIST(8) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:07 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевstax..так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен Это то пол беды, у меня результат - массив с одним элементом, а не с 9, как в случае без order by (который не падает).Не стоит баловаться с возможностями, которых по документации быть не должно, и к тому же делать какие-то выводы касательно функционала на основании этого. dbms_photoshopenv, Ага, надо было пойти еще дальше и поспрашивать 1) как collect работает с over (), хотя по доке она может быть только агрегатной 2) особенности работы ora_hash с произвольными типами включая UDF, хотя по доке во многих случаях она по доке не должна работать 3) как работает reverse на многобайтовых кодировках, хотя в доке ее вообще нет 4) детали работы полезной функции sys_op_map_nonnull 5) как вставить дату с 13-м месяцем и прочие важные детали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:13 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopНе стоит баловаться с возможностями, В работе не стоит использовать, а баловаться то почему нельзя? P.S. Фиг с ней с агрегативностью, rownum то почему пробрасывается, хотя план запроса говорит об оратном? Или это тоже документированное поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:16 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Ни у кого 12 под рукой нет? Что он возвращает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:18 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbms_photoshopandrey_anonymous, Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :)) Гм... а я бы рассказал... есть вариантик на автономке... Короче, я бы однозначно провалил собеседование на девелопера Как уже многие заметили, особенности работы с передаваемыми реф курсорами в качестве параметров в автономки даже с натяжкой сложно трактовать как грязные чтения. Я с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:23 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Срегей, еще раз. Collect - агрегатная функция. И в 12с тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЯ с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :) А вот это уже чистой воды грязные чтения. :) P.S. Понятно, что тоже не документировано, но поменяли ли поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:27 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевdbms_photoshopЯ с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :) А вот это уже чистой воды грязные чтения. :) P.S. Понятно, что тоже не документировано, но поменяли ли поведение?Чего менять-то? Ивент сделать недоступным? :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевdbms_photoshopНе стоит баловаться с возможностями, В работе не стоит использовать, а баловаться то почему нельзя? P.S. Фиг с ней с агрегативностью, rownum то почему пробрасывается, хотя план запроса говорит об оратном? Или это тоже документированное поведение?Имелось в виду, что с выводами от баловста надо быть осторожным. Очевидно что rownum не должно срабатывать до аналитики. Интересные моменты по этому поводу были тут Объясните поведение аналитической функции . Я таки предпринял попытку кратко описать механизм срабатывания "разных частей запроса". Когда уважаемые ревьюверы заревьювят - опубликую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:37 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39357065&tid=1886876]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
155ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 479ms |

| 0 / 0 |
