Справочная информация:
У меня есть приложение MS SQL, которое считывает данные из нашей биллинговой базы данных Oracle один раз в час в поисках новых платежей. Это достигается путем сохранения временной метки на основе CRT_DTTM
самой последней временной метки, найденной при каждом запуске.
, например
SELECT *
FROM V_TRANS
WHERE TRANS_CLS = 'P'
AND CRT_DTTM > TO_DATE('2010-01-25 12:59:44', 'YYYY-MM-DD HH24-MI-SS')
После возвращения этого результата MAX(CRT_DTTM)
сохраняется в качестве начальной отметки времени для следующего часового прогона.
Кажется, что происходит то, что иногда на стороне Oracle выполняется транзакция, которая вставляет данные в таблицу одновременно с выполнением моего запроса. Строки, по-видимому, не вставляются в порядке полученной метки времени. Это означает, что мой MAX(CRT_DTTM)
больше, чем некоторые строки, которые вставляются после завершения моего запроса. Я пропустил платежную информацию, и мои системы вышли из баланса.
Я считаю, что могу обойти это, просто изменив мой оператор SQL выше, добавив:
...
AND CRT_DTTM < SYSDATE - INTERVAL '10' MINUTE
Вопрос:
Я хочу знать, есть ли способ проверить строки, уже вставленные в таблицу, чтобы найти те карманы, в которых идентичность не совпадает с отметкой времени:
Я хочу найти карманы данных в этой ситуации, чтобы узнать, достаточно ли 10 минут, чтобы задержать просмотр метки времени.
SELECT *
FROM V_TRANS t1
JOIN V_TRANS t2
ON t1.trans_id < t2.trans_id
AND t2.crt_dttm < t1.crt_dttm
WHERE t1.TRANS_CLS = 'P'
AND t1.CRT_DTTM > TO_DATE('2010-01-25 12:59:44', 'YYYY-MM-DD HH24-MI-SS')
-- Only look at an interval of one day
AND t1.CRT_DTTM < TO_DATE('2010-01-25 12:59:44', 'YYYY-MM-DD HH24-MI-SS') + 1
Или, может быть, я пропускаю некоторые базовые настройки уровня изоляции транзакций? Я запускаю это через связанный сервер с OPENQUERY()