Как создать timestamp-поле c дефоултом SYSTIMESTAMP
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sdo Участник
Вступление в Клуб: 17.01.2017
|
Вт Янв 17, 2017 10:40  Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
Доброго дня, All !
При изменении статуса документа в таблицу событий пишется строка со ссылкой на документ и измененный статус. Стороннее ПО читает эту таблицу начиная с последнего запомненного id события. Таким образом мы не обрабатываем события, которые уже обработали. Казалось бы все благочинно, но опытные экзорцисты приглядываются к деталям.
Генерация ID для события происходит через стандартный seq, и когда происходит одновременно несколько insert'ов никто не гарантирует, что закоммитятся они ровно в той же последовательности, что и генерировались id. На практике это приводит к тому, что ПО-обработчики пропускают некоторые события. Например: прочитали события c 1 до конца, последним оказалось id =100. Запомнили. Пока обрабатывали и запоминали - в таблицу "дошли" события c id =86 и id=42.
Пока не придумано ничего лучше чем создать TIMESTAMP-поле, которое бы заполнялось исключительно ораклом при insert. Как создать такое поле силами ЦФТ?
Также буду признателен за предложение иного решения данной проблемы кроме запоминания ВСЕХ обработанных id и перечитывания событий не от последнего id а за прошлый час/день и т.п. |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Вт Янв 17, 2017 11:04  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
sdo пишет: | Пока не придумано ничего лучше чем создать TIMESTAMP-поле, которое бы заполнялось исключительно ораклом при insert. Как создать такое поле силами ЦФТ? |
А как ЭТО защищает от несогласованного commit?
допустим я добавила записей в 12:00, потом в другой сессии добавила в 12:01, вторую сессию закоммитила, а первая у меня на блокировке слегка подвисла и реально закоммитилась не в 12:00, а в 12:02 ? Записи из первой сессии тоже ведь внедрились внутрь временнОй последовательности, или разве нет?
При Вашей обработке мы запомним 12:01 и к записям, которые "дойдут" позже мы никогда не обратимся. |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Вт Янв 17, 2017 11:09  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
sdo пишет: | Доброго дня, All !
Также буду признателен за предложение иного решения данной проблемы кроме запоминания ВСЕХ обработанных id и перечитывания событий не от последнего id а за прошлый час/день и т.п. |
Какое-то кривое у Вас решение ...
Платежные документы - реквизит Штамп для проводки
[MAIN_DOCUM].[PROV_TIMESTAMP]
Что мешает
1) при "в таблицу событий пишется строка со ссылкой на документ и измененный статус" дергать стороннее ПО и передавать ему информацию ?
2) завести "в таблицу событий " поле "Обработан", из стороннего ПО селектить все события у которых "Обработан" <> 1 после чего апдейтить поле "Обработан" = 1 из стороннего ПО |
|
 |
sdo Участник
Вступление в Клуб: 17.01.2017
|
Вт Янв 17, 2017 11:29  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
vtar пишет: |
1) при "в таблицу событий пишется строка со ссылкой на документ и измененный статус" дергать стороннее ПО и передавать ему информацию
|
Слишком много изменений, да еще и добавляются зависимости от внешних факторов.
vtar пишет: |
2) завести "в таблицу событий " поле "Обработан", из стороннего ПО селектить все события у которых "Обработан" <> 1 после чего апдейтить поле "Обработан" = 1 из стороннего ПО |
Таких обработчиков несколько. И для каждого придется добавлять свое поле. И нагружать связку апдейтами.
А вот если бы как-то гарантировать что вставка не может состояться с ID меньшим, чем уже существует (мое ошибочное допущение при проектировании) - то все бы работало как и предполагалось. |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Вт Янв 17, 2017 11:51   |
|
Полезность: Нет оценки
|
sdo,
я давно пришел к мысли - интеграция со сторонним ПО это страшное зло ... Особенно на своей стороне, когда этого можно избежать ... |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Ср Янв 18, 2017 04:31  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
vtar пишет: | sdo пишет: | Доброго дня, All !
Также буду признателен за предложение иного решения данной проблемы кроме запоминания ВСЕХ обработанных id и перечитывания событий не от последнего id а за прошлый час/день и т.п. |
Какое-то кривое у Вас решение ...
Платежные документы - реквизит Штамп для проводки
[MAIN_DOCUM].[PROV_TIMESTAMP]
Что мешает
1) при "в таблицу событий пишется строка со ссылкой на документ и измененный статус" дергать стороннее ПО и передавать ему информацию ?
2) завести "в таблицу событий " поле "Обработан", из стороннего ПО селектить все события у которых "Обработан" <> 1 после чего апдейтить поле "Обработан" = 1 из стороннего ПО |
Ой-ой-ой... как долго!
Проще в таблицу событий писать с определённым id, ссылающимся на табличку "сборник событий, выгружаемых единым чохом", и состояние изменять уже в этой табличке. Тогда не миллион записей придётся апдейтить, а одну только. А остальной миллион уже на эту одну ссылается... |
|
 |
sdo Участник
Вступление в Клуб: 17.01.2017
|
Ср Янв 18, 2017 07:51  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
Эмиралька пишет: |
Ой-ой-ой... как долго!
Проще в таблицу событий писать с определённым id, ссылающимся на табличку "сборник событий, выгружаемых единым чохом", и состояние изменять уже в этой табличке. Тогда не миллион записей придётся апдейтить, а одну только. А остальной миллион уже на эту одну ссылается... |
это интересно, занимательно, но:
1) это добавление сущностей
2) непонятно на основании чего должна создаваться эта сущность
3) как обеспечить неизменяемость набора событий, входящих в "чох". |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Ср Янв 18, 2017 11:02  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
sdo пишет: |
это интересно, занимательно, но:
1) это добавление сущностей
|
чувствуется, уважаемый sdo любитель махнуть бритвой Оккамы
 |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Чт Янв 19, 2017 05:49  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
sdo пишет: | Эмиралька пишет: |
Ой-ой-ой... как долго!
Проще в таблицу событий писать с определённым id, ссылающимся на табличку "сборник событий, выгружаемых единым чохом", и состояние изменять уже в этой табличке. Тогда не миллион записей придётся апдейтить, а одну только. А остальной миллион уже на эту одну ссылается... |
это интересно, занимательно, но:
1) это добавление сущностей
2) непонятно на основании чего должна создаваться эта сущность
3) как обеспечить неизменяемость набора событий, входящих в "чох". |
не поняла замечаний, ну да ладно.
сохраняйте ссылку на транзакцию, у транзакции смотрите время коммита, вот вам и синхронизация. |
|
 |
sdo Участник
Вступление в Клуб: 17.01.2017
|
Чт Янв 19, 2017 08:28  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
Эмиралька пишет: |
не поняла замечаний, ну да ладно.
сохраняйте ссылку на транзакцию, у транзакции смотрите время коммита, вот вам и синхронизация. |
Теперь уже я окончательно перестал понимать как можно применить ваши слова к нашей реальности. Поясняю архитектуру:
Из триггера смены состояний документа вызывается insert в отдельную таблицу "истории". id для нее генерируется штатным секвенсом системы, шаг не поддается логике.
Практика показывает, что выборка последних N записей order by id не всегда является неизменной. Некоторые записи c меньшим id "доползают" в таблицу уже после того как мы зафиксировали максимальный id. Я описывал это в начале треда.
Пока выкрутились из ситуации добавив второй запрос "в прошлое" на 1000 записей и запоминая каждое событие и проверяя - а не отправлялось ли то что мы перечитали.
Я что-то сомневаюсь возможно ли поймать время коммита. У нас получалось поймать только время инсерта. |
|
 |
Эмиралька Эксперт
Вступление в Клуб: 09.11.2015
|
Чт Янв 19, 2017 09:39  Re: Как создать timestamp-поле c дефоултом SYSTIMESTAMP |
|
Полезность: Нет оценки
|
sdo пишет: |
Теперь уже я окончательно перестал понимать как можно применить ваши слова к нашей реальности. | Ну уж извините. sdo пишет: | Поясняю архитектуру | Мне ваша архитектура прекрасно понятна.
Что значение сиквенса, что timestamp одинаково не отображают реальности, потому что фиксация транзакции может осуществляться с задержкой. sdo пишет: | Из триггера смены состояний документа вызывается insert в отдельную таблицу "истории". id для нее генерируется штатным секвенсом системы, шаг не поддается логике. | Ну уж извините. На мой взгляд, вполне логичное решение, тем более что числа сортируются существенно быстрее прочих типов. sdo пишет: | Практика показывает, что выборка последних N записей order by id не всегда является неизменной. Некоторые записи c меньшим id "доползают" в таблицу уже после того как мы зафиксировали максимальный id. Я описывал это в начале треда. | Я прочитала, да. И ответила, что с timestamp у вас будут точно такие же проблемы. sdo пишет: | Пока выкрутились из ситуации добавив второй запрос "в прошлое" на 1000 записей и запоминая каждое событие и проверяя - а не отправлялось ли то что мы перечитали. | Я за вас рада. Надеюсь, вы не натолкнётесь на массовые (bulk) транзакции, в которых расход сиквенса чуть-чуть побольше. sdo пишет: | Я что-то сомневаюсь возможно ли поймать время коммита. У нас получалось поймать только время инсерта. | "Поймать" я предлагала только идентификатор транзакции, а время смотреть в системных представлениях. Ну что ж, попробуйте обратиться с вашими сомнениями к грамотному DBA. Я вам дала материал на подумать, а решать за вас задачу - извините.
Есть ещё один вариант, правда, не очень надёжный: Код: | select distinct ora_rowscn, SCN_TO_TIMESTAMP(ora_rowscn) from ; |
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|