Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Посоветуйте тип блокировки записи (оракл)   Найти похожие ветки 

 
ANB ©   (2005-12-13 10:33) [0]

Возникла необходимость для безопасной сетевой работы блокировать записи на длительное время.
Можно блокировать следующими способами
1. Штатным for update
2. Завести поле или таблицу блокировок
3. Смешать первые 2 способа.

У 1 плюсы : штатное средство, в случае убивания сессии она сама отвалится. Минус - мне желательно иметь тип блокировки (идет изменение, идет компиляция, идет выполнение), а так же инфу - с кто держит блокировку (хотя это можно и через штатную вытащить)
У 2 плюс - делаю любые типа и любую инфу могу занести, но если сессия отвалится, то блокировка зависнет. Плюс, ее надо делать в отдельной транзакции или врубать автокоммит (хотя он у меня и так включен).

Кто что может посоветовать из опыта ?


 
evvcom ©   (2005-12-13 10:41) [1]

Еще есть пакет DBMS_LOCK и вьюха v$lock. Плюсы те же что и у for update и, возможно, получится и тип блокировки как-то привязать.


 
Sergey13 ©   (2005-12-13 10:59) [2]

for update nowait  желательно наверное. А насколько длительной должна быть блокировка?


 
ANB ©   (2005-12-13 11:08) [3]


> Sergey13 ©   (13.12.05 10:59) [2]
> for update nowait  желательно наверное. А насколько длительной
> должна быть блокировка?

Про nowait то я помню. А блокировка может быть больше суток.


 
ANB ©   (2005-12-13 11:11) [4]

Короче - в блобиках лежат скрипты. Весьма нежелатально править их совместно и еще более нежелательно править их во время выполнения.
А выполнение уже идет около часа, а дальше будет еще дольше. Пока я один эту софтину гоняю, но в ближайшей перспективе возможно параллельное использование.


> evvcom ©   (13.12.05 10:41) [1]

Ща посмотрю . . .


 
Sergey13 ©   (2005-12-13 11:16) [5]

2[4] ANB ©   (13.12.05 11:11)
ИМХО, для подобных действий, лучше вообще всех выгнать из базы.


 
evvcom ©   (2005-12-13 11:29) [6]


> Ща посмотрю . . .

Я у Тома Кайта про это читал. Понятно все изложено и с примерами.


 
Курдль ©   (2005-12-13 12:33) [7]


> Посоветуйте тип блокировки записи (оракл)
> ANB ©


Чё, систему коллективного доступа делаешь? :)


 
ANB ©   (2005-12-13 12:42) [8]


> Курдль ©   (13.12.05 12:33) [7]
>
> > Посоветуйте тип блокировки записи (оракл)
> > ANB ©
>
>
> Чё, систему коллективного доступа делаешь? :)

Не. Робот для тестирования. Сначала я его только сам гонял, потом народ еще подсел, но у всех свои скрипты были, особо не мешались. А вот вылезает потихоньку проблема, что один и тот же тест нужно двоим эксплуатировать.


 
ANB ©   (2005-12-13 12:43) [9]


> Sergey13 ©   (13.12.05 11:16) [5]
> 2[4] ANB ©   (13.12.05 11:11)
> ИМХО, для подобных действий, лучше вообще всех выгнать из
> базы.

Уже поздно. Я набоорот всех на единый сервер перевел, чтобы, так сказать, КПД кода повысить.


 
Курдль ©   (2005-12-13 12:46) [10]


> ANB ©   (13.12.05 12:42) [8]
> Не. Робот для тестирования.


А "Рациональнгого робота" в смысле от Rational не пробовали?


 
ANB ©   (2005-12-13 12:47) [11]


> Курдль ©   (13.12.05 12:46) [10]
>
> > ANB ©   (13.12.05 12:42) [8]
> > Не. Робот для тестирования.
>
>
> А "Рациональнгого робота" в смысле от Rational не пробовали?
>

Пробовали. Не работает на наших программах. Иногда вообще на рекордере весь комп зависает.


 
ANB ©   (2005-12-13 17:46) [12]


> evvcom ©   (13.12.05 11:29) [6]

Тома Кайта под рукой нету, надо пройтись по кабинетам - поискать. Да в принципе и по комментариям в пакете все понятно. Только вот тип уже стоящей блокировки доставаться не хочет.


 
evvcom ©   (2005-12-14 08:41) [13]


> Только вот тип уже стоящей блокировки доставаться не хочет.

Может так тебе понравится. Формируешь стринги типа <TableName><Id><BlockType[1|2|3]>. Потом делаешь:
l_Id := DBMS_UTILITY.get_hash_value(str1, 0, 1073741823); -- str1 - для типа блокировки 1
if DBMS_LOCK.request(id => l_Id, timeout => 5, release_on_commit => True) = 1 -- Timeout
then -- анализ вьюхи v$lock на предмет установленных блокировок других типов
else
 if -- надо установить тип блокировки 2 или 3
 l_Id := DBMS_UTILITY.get_hash_value(str2, ... -- str2 - для типа блокировки 2
 DBMS_LOCK.request(...
 if -- надо установить тип блокировки 3
   l_Id := DBMS_UTILITY.get_hash_value(str3, ... -- str3 - для типа блокировки 3
 ...

end if;

т.е. устанавливаешь на нужную строку одну, две или три блокировки, чтобы задать/выяснить тип.
Опять же этот вариант, только если любой из типов блокировок должен приводить к эксклюзивной блокировке. Если эксклюзив неважен, то может еще и lockmode в request устроит?


 
ANB ©   (2005-12-14 09:02) [14]


> evvcom ©   (14.12.05 08:41) [13]

Я с пакетом разобрался. Даже книжку нашел. А вот никак не состыкую информацию из пакетных функций с информацией из v$lock.


 
ANB ©   (2005-12-14 09:05) [15]

Вообще то в книжке написано, что используют пакет, если не хотят блокировать записи. Можно играть флагами (по отказ/допуск) и так определять тип блокировки. Но не особо удобная штука. Придется генерить имя и хендл блокировки для каждой записи. Хотя это не сложно.


 
evvcom ©   (2005-12-14 09:33) [16]


> А вот никак не состыкую информацию из пакетных функций с
> информацией из v$lock

v$lock.type = "UL" - это user lock, то что тебе нужно
v$lock.sid - session id
v$lock.id1 - тот id, который передаешь в request
v$lock.lmode - lockmode из request
v$lock.ctime - время блокировки в секундах

> что используют пакет, если не хотят блокировать записи

на самом деле запись действительно не блокируется, просто выставляется флаг, по которому пользовательская процедура (триггер) определяет, что где-то этот флаг был взведен, значит обращаться к записи (группе записей) нельзя. Но использование пакета не ограничивается только нежеланием реального блокирования записей.

> Придется генерить имя и хендл

Ты имеешь ввиду хендл через allocate_unique? Том Кайт советует использовать все же DBMS_UTILITY.get_hash_value. Я попробовал сначала игнорировать этот совет и использовать allocate_unique в триггере, получил ошибку, что нельзя в триггере использовать commit! О, как...
Потом allocate_unique использует гораздо большее количество ресурсов. Поэтому переделал на get_hash_value, даже в количестве строк не проиграл, как выяснилось.


 
evvcom ©   (2005-12-14 09:47) [17]


> Только вот тип уже стоящей блокировки доставаться не хочет

Кстати еще вариант. Запрашиваешь эксклюзивную блокировку (lockmode = x_mode) и если удачно, то меняешь ее через DBMS_LOCK.convert на любую из SS, SX, S, SSX или не меняешь вовсе в зависимости от требуемого тебе типа. Итого можешь получить блокировки 5 разных типов. Ну как?


 
ANB ©   (2005-12-14 17:47) [18]


> v$lock.lmode - lockmode из request

Во. То, что нужно. Сенкс большой. Буду делать.



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
2-1138265818
delit
2006-01-26 11:56
2006.02.12
поиск в treeview


2-1137662162
tigra
2006-01-19 12:16
2006.02.12
Непонятка с exeшником


2-1138031349
uaf
2006-01-23 18:49
2006.02.12
отображение в RichEdit


3-1134387258
Wolferio
2005-12-12 14:34
2006.02.12
Управление базами


15-1137913617
Bogdan1024
2006-01-22 10:06
2006.02.12
А где достать самый полный хелп