![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посоветуйте тип блокировки записи (оракл)
ANB © (2005-12-13 10:33:00)Возникла необходимость для безопасной сетевой работы блокировать записи на длительное время.
Можно блокировать следующими способами
1. Штатным for update
2. Завести поле или таблицу блокировок
3. Смешать первые 2 способа.
У 1 плюсы : штатное средство, в случае убивания сессии она сама отвалится. Минус - мне желательно иметь тип блокировки (идет изменение, идет компиляция, идет выполнение), а так же инфу - с кто держит блокировку (хотя это можно и через штатную вытащить)
У 2 плюс - делаю любые типа и любую инфу могу занести, но если сессия отвалится, то блокировка зависнет. Плюс, ее надо делать в отдельной транзакции или врубать автокоммит (хотя он у меня и так включен).
Кто что может посоветовать из опыта ?
ANB (2005-12-14 17:47:00) [1]
> v$lock.lmode - lockmode из request
Во. То, что нужно. Сенкс большой. Буду делать.
evvcom (2005-12-14 09:47:00) [2]
> Только вот тип уже стоящей блокировки доставаться не хочет
Кстати еще вариант. Запрашиваешь эксклюзивную блокировку (lockmode = x_mode) и если удачно, то меняешь ее через DBMS_LOCK.convert на любую из SS, SX, S, SSX или не меняешь вовсе в зависимости от требуемого тебе типа. Итого можешь получить блокировки 5 разных типов. Ну как?
evvcom (2005-12-14 09:33:00) [3]
> А вот никак не состыкую информацию из пакетных функций с
> информацией из 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, даже в количестве строк не проиграл, как выяснилось.
ANB (2005-12-14 09:05:00) [4]Вообще то в книжке написано, что используют пакет, если не хотят блокировать записи. Можно играть флагами (по отказ/допуск) и так определять тип блокировки. Но не особо удобная штука. Придется генерить имя и хендл блокировки для каждой записи. Хотя это не сложно.
ANB (2005-12-14 09:02:00) [5]
> evvcom © (14.12.05 08:41) [13]
Я с пакетом разобрался. Даже книжку нашел. А вот никак не состыкую информацию из пакетных функций с информацией из v$lock.
evvcom (2005-12-14 08:41:00) [6]
> Только вот тип уже стоящей блокировки доставаться не хочет.
Может так тебе понравится. Формируешь стринги типа<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-13 17:46:00) [7]
> evvcom © (13.12.05 11:29) [6]
Тома Кайта под рукой нету, надо пройтись по кабинетам - поискать. Да в принципе и по комментариям в пакете все понятно. Только вот тип уже стоящей блокировки доставаться не хочет.
ANB (2005-12-13 12:47:00) [8]
> Курдль © (13.12.05 12:46) [10]
>
> > ANB © (13.12.05 12:42) [8]
> > Не. Робот для тестирования.
>
>
> А "Рациональнгого робота" в смысле от Rational не пробовали?
>
Пробовали. Не работает на наших программах. Иногда вообще на рекордере весь комп зависает.
Курдль (2005-12-13 12:46:00) [9]
> ANB © (13.12.05 12:42) [8]
> Не. Робот для тестирования.
А "Рациональнгого робота" в смысле от Rational не пробовали?
ANB (2005-12-13 12:43:00) [10]
> Sergey13 © (13.12.05 11:16) [5]
> 2[4] ANB © (13.12.05 11:11)
> ИМХО, для подобных действий, лучше вообще всех выгнать из
> базы.
Уже поздно. Я набоорот всех на единый сервер перевел, чтобы, так сказать, КПД кода повысить.
ANB (2005-12-13 12:42:00) [11]
> Курдль © (13.12.05 12:33) [7]
>
> > Посоветуйте тип блокировки записи (оракл)
> > ANB ©
>
>
> Чё, систему коллективного доступа делаешь? :)
Не. Робот для тестирования. Сначала я его только сам гонял, потом народ еще подсел, но у всех свои скрипты были, особо не мешались. А вот вылезает потихоньку проблема, что один и тот же тест нужно двоим эксплуатировать.
Курдль (2005-12-13 12:33:00) [12]
> Посоветуйте тип блокировки записи (оракл)
> ANB ©
Чё, систему коллективного доступа делаешь? :)
evvcom (2005-12-13 11:29:00) [13]
> Ща посмотрю . . .
Я у Тома Кайта про это читал. Понятно все изложено и с примерами.
Sergey13 (2005-12-13 11:16:00) [14]2[4] ANB © (13.12.05 11:11)
ИМХО, для подобных действий, лучше вообще всех выгнать из базы.
ANB (2005-12-13 11:11:00) [15]Короче - в блобиках лежат скрипты. Весьма нежелатально править их совместно и еще более нежелательно править их во время выполнения.
А выполнение уже идет около часа, а дальше будет еще дольше. Пока я один эту софтину гоняю, но в ближайшей перспективе возможно параллельное использование.
> evvcom © (13.12.05 10:41) [1]
Ща посмотрю . . .
ANB (2005-12-13 11:08:00) [16]
> Sergey13 © (13.12.05 10:59) [2]
> for update nowait желательно наверное. А насколько длительной
> должна быть блокировка?
Про nowait то я помню. А блокировка может быть больше суток.
Sergey13 (2005-12-13 10:59:00) [17]for update nowait желательно наверное. А насколько длительной должна быть блокировка?
evvcom (2005-12-13 10:41:00) [18]Еще есть пакет DBMS_LOCK и вьюха v$lock. Плюсы те же что и у for update и, возможно, получится и тип блокировки как-то привязать.