Oracle - Как узнать, что массовая вставка закончилась?

У нас есть таблица в базе данных Oracle, которая действует как посредник между двумя системами. Система A выполнит массовую вставку в таблицу, фиксируя каждые 50 000 строк. Система B будет продолжать запрашивать запись в таблице и, если она есть, выдаст оператор SELECT .. FOR UPDATE для обработки записей (система B многопоточная).

Проблема в том, что существует вероятность того, что система А по-прежнему массово вставляет данные, когда система Б запрашивает таблицу. Это может привести к тому, что система B получит неполный набор данных для обработки.

Можем ли мы в любом случае узнать, остановилась ли массовая вставка? Если мы хотим отслеживать, выполняется ли какая-либо insert активность на столе, возможно ли это? К сожалению, у нас нет контроля над тем, как работает Система А, поэтому мы не можем заставить ее послать нам какой-либо «конечный» сигнал.

Любые комментарии приветствуются. Спасибо.


person ipohfly    schedule 14.04.2015    source источник
comment
Вы можете запросить активные сеансы базы данных, чтобы узнать, подключена ли еще система A.   -  person Thilo    schedule 14.04.2015
comment
Если система А подключена к базе данных, но выполняет другие действия, все в порядке, вопрос заключается в том, можем ли мы узнать, что она прекратила помещать данные в таблицу.   -  person ipohfly    schedule 14.04.2015
comment
Сколько записей система B обрабатывает одновременно???   -  person psaraj12    schedule 14.04.2015
comment
U может иметь временную таблицу с первичным ключом вашей таблицы и обработанным флагом, чтобы вы знали, какие строки обрабатываются, а остальные вы можете обрабатывать в системе B.   -  person psaraj12    schedule 14.04.2015
comment
Вы можете проверить, для какого запроса SQL-система A в настоящее время работает.   -  person Thilo    schedule 14.04.2015
comment
Хм, я могу получить из представления v$sqlarea, но данные в этом списке удаляются с использованием алгоритма «наименьшего использования», верно? Я могу определить, прекратила ли Система А вставку данных из нее?   -  person ipohfly    schedule 14.04.2015
comment
@psaraj12 psaraj12 Обработка системы B в порядке, проблема заключается в том, чтобы убедиться, что когда система B захватывает данные, система A завершила массовую вставку в таблицу.   -  person ipohfly    schedule 14.04.2015
comment
@ipohfly проблема, как я вижу, заключается в том, что когда система B обрабатывает данные, вставка может произойти в системе A, поэтому они могут не обрабатываться с использованием временной таблицы, вы можете обрабатывать эти данные   -  person psaraj12    schedule 14.04.2015


Ответы (1)


Oracle будет автоматически получать блокировки на уровне строк/таблиц когда выполняется INSERT.

Если система A предоставляет достаточно видимой информации в V$SESSION , системное представление, которое показывает все подключенные сеансы, чтобы вы могли точно идентифицировать только сеансы системы A, вы должны иметь возможность запрашивать `V$LOCKED_OBJECT, чтобы найти объекты, заблокированные этими сеансами:

select count(*)
  from v$locked_object v
  join all_objects d
    on v.object_id = d.object_id
  join v$session s
    on v.session_id = s.sid
 where d.owner = :owner
   and d.object_name = :table_name
   and s.<some_identifying_data> = :something

Если система A блокирует ваш объект, вам нужно продолжать ждать; если система А была блокировала объект и больше не блокирует, вы можете запустить дополнительный процесс. Это потребует тестирования, чтобы определить точное поведение Системы А.

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

person Ben    schedule 14.04.2015
comment
да, модификация в Системе А была невозможна, но идея использования блокировок для этого может сократить ее. Я посмотрю. Спасибо =) - person ipohfly; 14.04.2015
comment
Мы провели небольшой пробный тест, и, кажется, он работает, в основном следуя вашей идее поиска замков. Тем не менее, чтобы протестировать большой набор данных, я все же думаю, что этого достаточно, чтобы отметить это как ответ. - person ipohfly; 29.04.2015