powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение таблицы из триггера (after-insert)
25 сообщений из 178, страница 6 из 8
Чтение таблицы из триггера (after-insert)
    #40010581
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это тебе еще про кластер (RAC) не рассказали
Там может быть еще интересней
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010583
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Других предложений я не видел

Неудивительно, вы же очень избирательно читаете только то, что укладывается в вашу картину мира.

Вот если вы сможете повторить это в действительно одной сессии, тогда "загадка" будет. А так - документированное поведение в многопользовательском режиме и крючкотворство в игре словами. Является чудом только для тех, кто не читал документацию.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010585
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загадкой, возможно и не будет
Если между операторами прошел достаточный срок
В БД есть и другие процессы/сессии, живущие своей жизнью, которым плевать на твою последовательность, но у них есть свои SQL-операторы, которые могут вытеснить определение твоей последовательности из Library Cache
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010588
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров

Думал там действительно что-то из https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-views-sequences-and-synonyms.html#GUID-5ABC0615-BE0C-48CE-BD18-C86AAF7DF953 The database might skip sequence numbers if you choose to cache a set of sequence numbers. For example, when an instance abnormally shuts down (for example, when an instance failure occurs or a SHUTDOWN ABORT statement is issued), sequence numbers that have been cached but not used are lost. Also, sequence numbers that have been used but not saved are lost as well. The database might also skip cached sequence numbers after an export and import
хотя здесь тоже не отражен случай, что определение просто выгрузилось из Library Cache
Насколько помню, в более ранних версиях про это было написано

PS. Но ты продолжай -- и мы поразвлекаемся и ты таки что-то новое узнаешь

Вячеслав, вышеописанные случаи вряд ли применимы здесь. В документе по ссылке выше Оракл описывает случаи когда разрывы происходят из-за жесткой потери чисел сиквенс. Жесткая потеря - это особый случай, когда числя в кэше потерялись, не будучи использованными из-за сбоя, потери питание, и т.д. Появился разрыв, этих чисел никто не видел и не увидит.

В моем примере нет потери чисел, и нет сбоев, все работает штатно.
Все числа сиквенса были успешно получены, все находятся в таблице.
Есть наблюдаемый разрыв внутр сессии, т.к. currval намеренно (и я считаю полезно для программиста)
возвращает текущее значение не глобального объекта, а запомненного последнего значения для этой сессии.

Следствие: две разные сессии которые вызовут currval на одном объекте ВСЕГДА увидят разные числа.
Пока я только пользовался nextval, все эти тонкости мне были незаметны. А когда заметил, углубился потому что мне интересно.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010590
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,
это пока цветочки.
Ягодки проявятся, когда выяснится, что у него на сиквенсах сторонняя логика построена,
типа раз значение меньше, то ясно, что оно раньше, а иначе позже.
Вот это будет - обхохочешься.
И по той уверенности в своих навыках понимания, которые демонстрирует клиент, я почти уверен, что так уже и есть.

:))
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010595
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты просто не осилил, что я сказал

Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval, если у него такое предназначение и это описано в доке -- мне трудно понять
Но, наверное, сомневаться -- это здорово, нам некогда работать -- будем сомневаться

PS. А еще не натыкался, что несколько вызовов nextval в одном запросе возвращают одно значение? Вот где разрыв шаблона!
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010598
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Держите "загадку".

От первого nextval до select currval других сессий не было.
Код: 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.
SQL> create table dropme_t(n number);

Table created.

SQL> create sequence dropme_s start with 1 maxvalue 1000 nocache order;

Sequence created.

SQL> insert into dropme_t(n) values(dropme_s.nextval);

1 row created.

SQL> insert into dropme_t(n) values(dropme_s.nextval);

1 row created.

SQL> select * from dropme_t;

         N
----------
         1
         3

SQL> select dropme_s.currval c from dual;

         C
----------
         4



Изученных инструментов должно хватить для "решения".
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010622
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Ты просто не осилил, что я сказал

Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval, если у него такое предназначение и это описано в доке -- мне трудно понять
Но, наверное, сомневаться -- это здорово, нам некогда работать -- будем сомневаться

PS. А еще не натыкался, что несколько вызовов nextval в одном запросе возвращают одно значение? Вот где разрыв шаблона!


Да ну, неужели?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> update test
  2  set id = sq_test.nextval;
15117 rows updated

SQL> set serveroutput on
SQL> exec dbms_output.put_line( 'one:' || sq_test.nextval || ' two:' ||sq_test.nextval);
one:15158 two:15159
PL/SQL procedure successfully completed



Шучу. Я в работе не натыкался, но на неделе видел в документации, оракл об этом очень недвусмысленно говорит.
Вроде еще есть ограничения на внутренние селекты.

> Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval
Это потому, что не написано "предыдущий nextval для этой сессии". В многопользовательском режиме это существенное различие, особенно когда в следующей строчке таким же языком описывается nextval независим от сессии.

Возможно это мои тараканы, когда я работал редактором тех документации я обращал внимание на такие мелочи.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010625
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Навык умалчивания контекста и крючкотворства в игре словами с той же поры остался?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010643
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Других предложений я не видел

Неудивительно, вы же очень избирательно читаете только то, что укладывается в вашу картину мира.

Вот если вы сможете повторить это в действительно одной сессии, тогда "загадка" будет. А так - документированное поведение в многопользовательском режиме и крючкотворство в игре словами. Является чудом только для тех, кто не читал документацию.


Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете.

Думаю, что в официальной документации "currval - в контексте сессии, а nextval - глобальный" так нигде и не упомянуто.

По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную.

https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html

Давайте я лучше новый вопрос задам на понимание сиквенс.

Вот этот самый кэш сиквенса (который длиной двадцать по умолчанию, и может повлиять на скорость), он глобальный для БД, или свой на каждую сессию? (этого нет в доках, надо подумать).
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010645
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Такое поведение currval для новичка неинтуитивное, но полезное: можно пользоваться currval вместо запоминания числа в переменной, оно не изменится в контексте сессии. Пример в конце страницы по ссылке выше это демонстрирует.


не забывайте о триггерах

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010647
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете.



22218292
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010648
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
Вячеслав Любомудров,
это пока цветочки.
Ягодки проявятся, когда выяснится, что у него на сиквенсах сторонняя логика построена,
типа раз значение меньше, то ясно, что оно раньше, а иначе позже.
Вот это будет - обхохочешься.
И по той уверенности в своих навыках понимания, которые демонстрирует клиент, я почти уверен, что так уже и есть.

:))


Точно, у меня так и есть: сиквенс используется чтобы установить порядок, в котором импортировались данные через заданный канал.
Поскольку глобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик, это должно надежно работать.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010649
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Давайте я лучше новый вопрос задам

Это чтобы на мой не отвечать?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010651
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вот этот самый кэш сиквенса

НеофитSQL
свой на каждую сессию

И если подумать в контексте многопользовательской среды, то даже понятно почему.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010656
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
НеофитSQL
Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете.



22218292


Признаю ошибку. Я это сообщение от env не заметил. В нем действительно Оракл ясно все объясняет используя термин "юзер", включая невозможность одного юзера увидеть значения полученные другим, а также возможность юзеру продолжать пользоваться последним значением, даже если другой юзер его увеличит.

Я гуглил довольно старательно, но вместо "юзер" искал упоминания сессии.

Зная, что в среде Оракла иногда "юзер и схема" используются взаимозаменяемо, хочется услышать мнение опытных товарищей:
в вышеупомянутом описании работы сиквенсов, было бы правильно использовать слово сессия, или юзер (который с именем и паролем)?

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

Env, извини дружище. Я не увидел твой текст, глаза искали ссылку.

Отвечу на ранее заданный собственный вопрос: кэш для сиквенсов является глобальным, поэтому "запоминание" последнего значения в currval каждой сессии с этим кэшем не связано.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLглобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик

А вот это Ваши фантазии. Никто нигде монотонное увеличение не обещает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010661
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нерешенным остался вопрос, можно ли подсмотреть какое последнее число было выдано сиквенсом, не в текущей сессии, а глобально.

Или подсмотреть какое следующее число выдаст nextval, при этом не увеличивая сиквенс.

Эти два вопроса не совсем одно и то же, ответы могут различаться больше чем на 1 при штатной работе системы.


Пошерстив интернет и прочитав ответы умных людей, пришел к выводу что эта информация недоступна ни программисту, ни ДБА.

Хочешь знать какое будет следующее значение - бери его через nextval, и мирись с инкрементом.
Хочешь знать какое было последнее выданное в любой из сессий - никак. По крайней мере, гуру с интернета так считают.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010668
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLглобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик

А вот это Ваши фантазии. Никто нигде монотонное увеличение не обещает.


Я сначала удивился, но теперь думаю что вы или пытаетесь намекнуть на циклы в счетчике (у меня цикл выключен), или возможно забыли определение монотонности последовательности.

Например, последовательность натуральных чисел 1,2,3,7,42,314,1000 является монотонно увеличивающейся, потому что каждое следующее значение строго больше предыдущего.

А что вы имели в виду?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010670
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLА что вы имели в виду?

А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в
порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для
Ваших нужд последовательности бесполезны чуть менее чем совсем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010671
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Вот этот самый кэш сиквенса

НеофитSQL
свой на каждую сессию

И если подумать в контексте многопользовательской среды, то даже понятно почему.


Кэш действительно глобальный, один на целый сиквенс.
Не огорчайтесь, это неочевидно. (и наверное, мне не стоило упоминать сессии вблизи этого вопроса, это могло запутать).

К этому выводу можно прийти из опыта, через рассуждения или эксперимент.
У меня опыта мало, поэтому я проверил свои рассуждения экспериментом. Действительно, глобальный.
В нем лежат (а иногда пропадают бесследно) числа последней блочной аллокации, чтобы из-за каждого +1 на диск не писать.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010673
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
НеофитSQLА что вы имели в виду?

А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в
порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для
Ваших нужд последовательности бесполезны чуть менее чем совсем.
ну, строго говоря, есть CREATE SEQUENCE ... ORDER

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm ORDER
Specify ORDER to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys.
в какой ситуации, выполняя запросы вида insert into tab(id, ts) values (seq.nextval, systimestamp), мы получим расхождение в очередности id и ts?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010679
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLА что вы имели в виду?

А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в
порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для
Ваших нужд последовательности бесполезны чуть менее чем совсем.


Хорошо вы меня успокоили что сиквенс монотонный, но обратили внимание на проблему
со вставками его использующие.

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

С одной сессией все понятно: если я вставляю несколько строчек сразу, они обработаются в любом порядке.
Так устроен не только Оракл, это общий принцип. Если мне важен порядок, я буду вставлять по одной строке.

Если интересно, давайте разберем конкретный случай:
Есть таблица, сиквенс и "before-insert" триггер. Поскольку в 11.2 еще не было автонумерации строчек,
кодер использует триггер и сиквенс чтобы создать уникальные ID для основного ключа.

Теперь две сессии (или юзера, или еще две чего-то независимых) вставляют по одной строчке наперегонки:
первая A, а вторая - X.

Тригер их увидет в каком-то неизвестном заранее порядке, возможно одновременно на многоядерном процессоре - я не знаю.
Но исполнение триггера сериализуется на сиквенсе, где вызов nextval послужит механизмом синхронизации для строгой очередности.
Допустим мы получили А1-Х2, первая сессия обогнала вторую. Строки были помечены в триггере с намеком на очередность, но строки еще не вставлены.

Я понимаю вы говорите что эти строки могут на самом деле вставиться в таблицу в порядке X2-A1, и что существует какой-то дополнительный счетчик операций, который сможет показать что Х2 "физически" вставилась первой, а А1 - второй.

Возможно, но это должно влиять на бизнес-логику. Я постулирую что порядок присвоенный в триггере является единственно верным для определения очередности, и всегда отсортирую А1-Х2 исходя из этого. Поэтому невидимая для меня деталь что вставка двух строчек имела какую-либо очередность не должна ни на что повлиять. Как триггер сказал - такая и последовательность.
Я даже не знаю как отсортировать в порядке времени вставки. Это возможно? Это используют? Зачем?

Вы считаете, есть случаи когда нужно беспокоиться о порядке в которой строчки были вставлены? Я не сумел придумать пример где это было бы полезно.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010681
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
Dimitry Sibiryakov
пропущено...

А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в
порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для
Ваших нужд последовательности бесполезны чуть менее чем совсем.

ну, строго говоря, есть CREATE SEQUENCE ... ORDER

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm ORDER
Specify ORDER to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys.

в какой ситуации, выполняя запросы вида insert into tab(id, ts) values (seq.nextval, systimestamp), мы получим расхождение в очередности id и ts?

Это в точку. Я помчался посмотреть как у меня - там уже стояло ORDER, но не потому что я предусмотрительный, а потому что скопировал свои сиквенсы из тех что были и исполняли похожую функцию.

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

Ну и ну! По умолчанию присваивает уникальные, но не обязательно увеличивающиеся номера? Что так трудно?

Тьфу, дочитал, отбой. Это похоже относится только к кластерам, где действительно монотонность стоит дорого.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010683
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL...
По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную.
https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html

Смотрю в книгу вижу RAC фигу. О чем и говорил Вячеслав.

Непонятно только, зачем этот бессознательный поток на форум нести? Освой концепции и вопросов станет на порядок меньше.
...
Рейтинг: 0 / 0
25 сообщений из 178, страница 6 из 8
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение таблицы из триггера (after-insert)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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