Страница 1 из 1

Блокировки в Oracle

Добавлено: 01 ноя 2005, 10:20
Zy
Hi!

Действуем по сценарию:
1. Запускаем sqlplus с именем и паролем.
2. Запускаем вторую копию sqlplus с тем же именем и паролем.
3. sqlplus 1:
create table a (id number(12, 0));
insert into a values(1);
commit;
update a set id = 2 where id = 1;
4. sqlplus 2:
update a set id = 3 where id = 1;

Теперь мы видим, что sqlplus 2 остановился и ждет завершения транзакции в sqlplus 1 (причем, это не deadlock!).

Вопрос: можно ли как-то регулировать время ожидания окончания транзакции и если истекло время тайм-аута выдать сообщение об ошибке?

Добавлено: 01 ноя 2005, 10:52
Vovchik
На сервере выставить тайм аут (по умолчанию - бесконечность). Или динамически в сессии.
Как трансакция отвалится по таймауту - это надо словить и обработать

Лично я предпочитаю проверять на наличие блокировки:

SELECT id_no INTO :il_value FROM table WHERE bla-bal = :something
FOR UPDATE NOWAIT;

If sqlca.sqlcode <> 0 Then
ls_code = string(sqlca.sqldbcode)
ls_err = sqlca.sqlerrtext
If sqlca.sqldbcode = 54 Then
ls_desc = '~n Record is lock! Please, try again later.'
End If
rollback;

return
End If

Добавлено: 01 ноя 2005, 11:04
Zy
На сервере выставить тайм аут (по умолчанию - бесконечность).
Вот это меня и интересует - где и какой параметр, если можно!

Все остальное я знаю, но в данной ситуации не катит: можно менять только настройки, не код.

Добавлено: 01 ноя 2005, 11:55
Vovchik
Zy писал(а):
На сервере выставить тайм аут (по умолчанию - бесконечность).
Вот это меня и интересует - где и какой параметр, если можно!

Все остальное я знаю, но в данной ситуации не катит: можно менять только настройки, не код.
В общем ты out of luck. Мона сделать в iSQlPlus где этот параметр в HTTP сервере. А Оракловый сервер будет ждать вечно в такой ситуации. Вот примерчик.

An Oracle server waits indefinitely for lock conflicts between transactions to be resolved. You can limit the amount of time that an Oracle server waits for locks to be resolved by setting the Oracle8 ODBC Driver? LockTimeOut entry in the oraodbc.ini file. The value you enter for the LockTimeOut parameter is the number of seconds after which an Oracle server will time out if it cannot obtain the requested locks. In the following example, the Oracle server will time out after 60 seconds:


[Oracle ODBC Driver Common]

Driver Logging=0

RemoveControlChars=NO

LockTimeOut=60

Добавлено: 01 ноя 2005, 12:10
Vovchik
Zy писал(а):
На сервере выставить тайм аут (по умолчанию - бесконечность).
Вот это меня и интересует - где и какой параметр, если можно!

Все остальное я знаю, но в данной ситуации не катит: можно менять только настройки, не код.
А еще мона и...ся и сиьулировать распределенную трансакцию. Тогда можно использовать DISTRIBUTED_LOCK_TIMEOUT. Но это опять же надо код менять так что тебе все равно не поможет :))

Добавлено: 01 ноя 2005, 12:11
Zy
Спасибл!

Я непреднамеренно ужесточил условия - сам oracle пусть ждет, сколько хочет, я обращаюсь-таки из приложения. У меня, правда, JDBC, но, я надеюсь, и там что-то такое есть.

Добавлено: 01 ноя 2005, 12:16
Vovchik
Zy писал(а):Спасибл!

Я непреднамеренно ужесточил условия - сам oracle пусть ждет, сколько хочет, я обращаюсь-таки из приложения. У меня, правда, JDBC, но, я надеюсь, и там что-то такое есть.
Мля, с этого надо начинать было. Обычно во всех этих ODBC/OLE DB/JDBC и прочей миддлверной муйне такие прибамбасы есть. Даже всякие коннекшен пулы нонче пихают в драйверы.

Добавлено: 01 ноя 2005, 12:38
Zy
Мля, с этого надо начинать было...
Да как-то не подумал :-) Мне сказали, что это настройки оракла. Про пулы я, конечно, знаю, а вот про блокировки я как-то не догадался.

Добавлено: 01 ноя 2005, 19:12
vg
Zy писал(а):
Мля, с этого надо начинать было...
Да как-то не подумал :-) Мне сказали, что это настройки оракла. Про пулы я, конечно, знаю, а вот про блокировки я как-то не догадался.
Прошу прощения, что я тут сосвоим свиным рылом да в чужое дело. Просто подумал, если ты из обращаешься из клиента, то может посмотреть как повлияет тип транзакции. Ну может попробовать "Dirty Read" задавать?

Добавлено: 05 ноя 2005, 23:57
Zy
Просто подумал, если ты из обращаешься из клиента...
Там запись идет в одну и ту же строку (rowset), и клиента менять нельзя.