Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1138196506
medvedenator
2006-01-25 16:41
2006.02.12
KERNEL32.DLL


2-1138083711
Mike48
2006-01-24 09:21
2006.02.12
Подскажите литературу......


1-1137030303
Kolya
2006-01-12 04:45
2006.02.12
Загрузка плейлистов


5-1124276865
Andrushk
2005-08-17 15:07
2006.02.12
Сохранение поля типа TObjectList


2-1138293373
Chechako
2006-01-26 19:36
2006.02.12
Выбрать запись c максимальным значением поля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский