Форум: "Базы";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
ВнизПосоветуйте тип блокировки записи (оракл) Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c