CftClub.ru
Клуб специалистов ЦФТ-Банк

Как создать timestamp-поле c дефоултом SYSTIMESTAMP

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Oracle DBA
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 любитель махнуть бритвой Оккамы
Smile
_________________
Нельзя всем дать всё: всех много, а всего мало
Эмиралька
Профи
Неподтвержденный


Вступление в Клуб: 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 ;
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Oracle DBA Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru