Как установит время блокировки на Oracle?
boogiman
Дата: 02.06.2006 15:08:19
Приветствую всех!!!
Хотел бы задать вам непростой ворос. Как в сервере настроить, чтобы для определённого пользователя время запуска процессов составляло не более определённого времени (скажем 3-х минут). Опишу конкретную проблему для детальной ситуации: пользователь "A" update данные из многомилионной таблицы, программный лоадер пытается вставить запись в эту таблицу (Deadlock Situashion - не возникает). Сейчас ситуация такова, что лоадер ждёт по 30 минут, пока таблица освободится! "Deadlock Situashion" - сервер не пишет! Соответственно на одном сервере происходит тупое зависание по 40 минут лоадера, а в это же время можно было бы обрабатывать другие серваки, отключившись от данного сервака!!! Вот к примеру на Sybase это будет так : "set lock wait 180".
Oracle -9.2, PowerBuilder -7.0 (лоадер).
Спасибо!!!
the_moon
Дата: 02.06.2006 15:11:51
begin
select * from bigtable for aupdate nowait;
insert into bigtable (values ();
exception
end;
dmitrysk
Дата: 02.06.2006 15:23:06
Интересно, а каким образом построено приложение, что операция update локирует всю таблицу целиком??? Это глючное приложение, а не Oracle.
Alexey Polovinkin
Дата: 02.06.2006 15:25:44
Будьте любезны - объясните а зачем вам делать Update???
Сессия 1
SQL> connect scott@alex92/tiger;
Connected.
SQL> insert into test_tbl select level, 'aaaa' from dual connect by level < 500;
499 rows created.
Сессия 2
SQL> connect scott@alex92/tiger;
Connected.
SQL> insert into test_tbl select level, 'aaaa' from dual connect by level < 500;
499 rows created.
Сессия 1
SQL> commit
2 /
Commit complete.
Сессия 2
SQL> commit
2 /
Commit complete.
SQL> select count(*) from test_tbl
2 /
COUNT(*)
----------
1497
SQL>
alex-ls
Дата: 02.06.2006 15:33:24
dmitrysk |
Интересно, а каким образом построено приложение, что операция update локирует всю таблицу целиком??? |
а может там и не блокировка возникает? Надо бы трассировочку включить...
Alexey Polovinkin
Дата: 02.06.2006 15:36:39
alex-ls |
dmitrysk | Интересно, а каким образом построено приложение, что операция update локирует всю таблицу целиком??? |
а может там и не блокировка возникает? Надо бы трассировочку включить... |
Там больше на кривые руки похоже - трассировочка им не поможет...
waspwort
Дата: 02.06.2006 15:43:41
boogiman |
Приветствую всех!!! Хотел бы задать вам непростой ворос. Как в сервере настроить, чтобы для определённого пользователя время запуска процессов составляло не более определённого времени (скажем 3-х минут). Опишу конкретную проблему для детальной ситуации: пользователь "A" update данные из многомилионной таблицы, программный лоадер пытается вставить запись в эту таблицу (Deadlock Situashion - не возникает). Сейчас ситуация такова, что лоадер ждёт по 30 минут, пока таблица освободится! "Deadlock Situashion" - сервер не пишет! Соответственно на одном сервере происходит тупое зависание по 40 минут лоадера, а в это же время можно было бы обрабатывать другие серваки, отключившись от данного сервака!!! Вот к примеру на Sybase это будет так : "set lock wait 180". Oracle -9.2, PowerBuilder -7.0 (лоадер). Спасибо!!! |
Update в одной сессии не блокирует Insert в другой, если только изменения не затрагивают PK или UK только что вставленной записи. Если большая таблица и долго происходят параллельные операции, можно копнуть в сторону партицирования и/или FreeList
boogiman
Дата: 02.06.2006 16:01:12
Дело в том,что вся логика находится в зашифрованном виде в пакетах. Софт полностью куплен, мой лоадер только считывает или update записи в определённых таблицах (доступ к которым мы имеем),ну и потом всё сливается в опердень. Почему в ДОЛБАНОМ оракле нельзя строго установить время на блокировку транзакции, как это легко сделать на Sybase и MSSQL
Sybase:execute immediate 'set lock wait 200' using lt_Filialca;
MSSQL: execute immediate 'SET LOCK_TIMEOUT 200' using sqlca;
dmitrysk
Дата: 02.06.2006 16:12:58
Зачем покупать такие ДОЛБАННЫЕ приложения?
alex-ls
Дата: 02.06.2006 16:13:21
boogiman |
Дело в том,что вся логика находится в зашифрованном виде в пакетах. |
ПРОТРАССИРУЙТЕ КОД!