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

Как узнать запущены ли на данном экземпляре какие-н операции

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеЧт Ноя 08, 2012 05:58   Как узнать запущены ли на данном экземпляре какие-н операции Ответить с цитатой
Полезность: Нет оценки
Как узнать запущены ли на данном экземпляре какие-н простые операции, естественно другими пользователями. Вопрос возник потому что если просто поднята форма объект ещё не блокирован. В списке сессий вижу только операцию, а id экземпляра -нет.
molokov
Участник со стажем


Вступление в Клуб: 28.09.2007
СообщениеЧт Ноя 08, 2012 09:51   Re: Как узнать запущены ли на данном экземпляре какие-н опер Ответить с цитатой
Полезность: Нет оценки
Если запускается любая простая операция, она сразу устанавливает блокировку, на него, можете проверить, зайдите в два навигатора, в одном запустите простую операцию на каком-нибудь объекте, и в другом попробуйте на нем же запустить другую операцию, увидите сообщения что оно занято, другим. Можно узнать занять ли сейчас данный id кем либо вот так:
в коде переменной p_object присвоить ID блокированного экземпляра.

declare

retb boolean;

a varchar2(300);

p_object varchar2(300);

p_subject varchar2(300);

l_info varchar2(300);

l_time date;

l_user varchar2(300);

u_ses varchar2(300);

os_user varchar2(300);

ora_user varchar2(300);

username varchar2(300);

u_info varchar2(300);

begin

a := lock_info.open();

p_object := '12990682067';

p_subject := 'FORM';

retb := lock_info.get_info( p_object,

p_subject,

l_info,

l_time,

l_user,

u_ses,

os_user,

ora_user,

username,

u_info,

1

);

if retb = true then

a := '1';

else

a := '0';

end if;

dbms_output.put_line('retb:' || a ||

' ora_user:' || ora_user || ' username:' || username || ' сессия: ' || u_ses || ' AUDSID: ' || l_user || ' процесс: ' || l_info);

lock_info.close();

end;



Alkov пишет:
Как узнать запущены ли на данном экземпляре какие-н простые операции, естественно другими пользователями. Вопрос возник потому что если просто поднята форма объект ещё не блокирован. В списке сессий вижу только операцию, а id экземпляра -нет.
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеЧт Ноя 08, 2012 11:49   Re: Как узнать запущены ли на данном экземпляре какие-н опер Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
Как узнать запущены ли на данном экземпляре какие-н простые операции, естественно другими пользователями. Вопрос возник потому что если просто поднята форма объект ещё не блокирован. В списке сессий вижу только операцию, а id экземпляра -нет.

Простая операция всегда блокирует экземпляр.
Проверить блокировку очень просто - попробовать заблокировать самому(%lock). Если не получится (exception when CANNOT_LOCK) - значит экземпляр уже заблокирован ранее
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПт Ноя 09, 2012 05:49    Ответить с цитатой
Полезность: Нет оценки
2devor
я же написал что блокировки(в таблице) не происходит...эти способы не годятся.

2molokov
одна операция простая вторая групповая, вот именно групповой и нужно узнать о работе с экземпляром, спасибо за lock_info.get_info попробую, в принципе понятно было что надо работать с ЦФТ-шным блокировщиком...
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПт Ноя 09, 2012 15:40    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
2devor
я же написал что блокировки(в таблице) не происходит...эти способы не годятся.

Если простая операция запущена (поднята экранная форма), то блокировка есть в любом случае. она не может не есть.
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПн Ноя 12, 2012 05:02    Ответить с цитатой
Полезность: Нет оценки
2 devor

Блокировка есть только на уровне блокировщика ЦФТ, на уровне таблицы её нет, пока не нажмут на форме OK.

Если сделать такую групповую То прагмы не будет.
begin
-- проверим что клиенты не блокированы.
for cl in ::[CLIENT] all where cl in (тут id)
lock nowait
loop
cl%lock;
rtl.lock_object(cl);
debug_pipe('Нет блокировки для ='||cl,0);
end loop;
exception when rtl.CANNOT_LOCK then
pragma error('клиент заблокирован! );
end;
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПн Ноя 12, 2012 10:39    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
2 devor
я
Блокировка есть только на уровне блокировщика ЦФТ, на уровне таблицы её нет, пока не нажмут на форме OK.

Да, в этом случае блокировка логическая.
Проверить можно функциями
lock_info.check_lock(object_id, class_id)
или сразу
rtl.check_lock(object_id, class_id)
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеПн Ноя 12, 2012 10:48    Ответить с цитатой
Полезность: Нет оценки
Если запущена форма, то можно глянуть FRM_LOCKS. Данная табличка показывает на каком объекте запущена форма и каким пользователем.
_________________
всегда есть как минимум 2 выхода
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПн Ноя 12, 2012 10:57    Ответить с цитатой
Полезность: Нет оценки
Да сделал , уже как предлагали выше через retb := lock_info.get_info( p_object,...) - всё работает, правда если запустят просто операцию просмотра думаю тоже будет показывать, а не хотелось бы.
проверил rtl.check_lock -тож работает. Всем спасибо!
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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