Oracle - Как да разбера, че груповото вмъкване е приключило?

Имаме таблица в базата данни на Oracle, която действа като посредник между две системи. Система A ще направи групово вмъкване в таблицата, като се ангажира на всеки 50 000 реда. Система B ще продължи да прави запитвания към таблицата за запис и ако има такъв, ще издаде оператор SELECT .. FOR UPDATE за обработка на записите (Система B е многонишкова).

Проблемът е, че има вероятност Система А все още да вмъква групово данните, когато Система Б прави заявка към таблицата. Това може да накара Система B да получи непълен набор от данни за обработка.

Все пак можем ли да разберем дали груповото вмъкване е спряло? Ако искаме да наблюдаваме дали има някаква insert дейност, извършена на масата, възможно ли е? За съжаление нямаме контрол върху това как работи Система А, така че не можем да я накараме да ни изпрати сигнал за „край“.

Всички коментари се оценяват. Благодаря ти.


person ipohfly    schedule 14.04.2015    source източник
comment
Можете да направите запитване към активните сесии на базата данни, за да видите дали System A все още е свързана.   -  person Thilo    schedule 14.04.2015
comment
Ако система A е свързана с базата данни, но прави други неща, всичко е наред, въпросът е дали можем да знаем, че е спряла да въвежда данни в таблицата   -  person ipohfly    schedule 14.04.2015
comment
Колко записа обработва система B наведнъж???   -  person psaraj12    schedule 14.04.2015
comment
Можете да имате временна таблица с първичен ключ на вашата таблица и обработен флаг, така че да знаете кои редове са обработени и останалите можете да обработите в система B   -  person psaraj12    schedule 14.04.2015
comment
Можете да проверите за каква заявка SQL система A работи в момента.   -  person Thilo    schedule 14.04.2015
comment
Хм, мога да получа от изгледа v$sqlarea, но данните в този списък се премахват с помощта на алгоритъма за най-малко използване, нали? Мога да определя дали System A е спряла да вмъква данни от нея?   -  person ipohfly    schedule 14.04.2015
comment
@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 , системният изглед, който показва всички свързани сесии, за да идентифицирате положително само сесиите на System 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 е заключвала обекта и вече не е, можете да стартирате своя вторичен процес. Това ще изисква тестване, за да се определи точното поведение на Система А.

Разбирам, че това не е напълно възможно, но по-интегриран начин би бил да се модифицира процесът на System A, така че да предизвиква някаква форма на събитие при прекратяване. Вие можете да използвате това събитие, за да стартирате насрочено задание.

person Ben    schedule 14.04.2015
comment
да, модификацията на система А не беше възможна, но идеята за използване на ключалки за това може да се отреже. Ще го погледна. Благодаря =) - person ipohfly; 14.04.2015
comment
Направихме малък примерен тест и изглежда работи, основно следвайки идеята ви да търсите ключалки. Все още трябва да се тества с голям набор от данни, но все пак мисля, че е достатъчно добър, за да отбележа това като отговор. - person ipohfly; 29.04.2015