Как установит время блокировки на 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
Дело в том,что вся логика находится в зашифрованном виде в пакетах.

ПРОТРАССИРУЙТЕ КОД!