Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Странное поведение SEQUENCE  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
Здравствуйте!

Столкнувшись с редким багом в работе своей системы, пытаемся разобраться в чем дело.
Есть таблица, в которую пользователями периодически заливается по несколько тысяч записей.
Для первичного ключа используется
create sequence RQRT_KEY
minvalue 0
maxvalue 999999999999999999999999999
start with 899452
increment by 1
nocache
order;
Значения из последовательности вытаскиваются вручную SELECT'ом, потом формируется запрос на INSERT.
За месяц в таблицу попало 2 строки со значением ключа 0 (ноль).
Оба раза баг появлялся в одной и той же ситуации.
Два пользователя паралельно вставляют данных и по очереди "дёргают" sequence.
В какой-то у одного из пользователей процесс заканчивается.
И сразу после этого второму пользователю в качестве ключа присваивается 0.
Т.е. буквально

...
789861 chikova 29.05.2008 10:50:16
789862 protasov 29.05.2008 10:50:16
789863 chikova 29.05.2008 10:50:16
0 protasov 29.05.2008 10:50:17
789864 protasov 29.05.2008 10:50:17
789865 protasov 29.05.2008 10:50:18
...
Понятно, что баг скорее всего в нашей проге, но хотелось бы спросить у общественности -
не сталкивался ли кто с подобным? :)


с уважением,
Дмитрий Жучков
7 июн 08, 12:23    [5775122]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Sevick
Member

Откуда: из-за компа
Сообщений: 833
Если у вас и правда первичный ключ по этому полю, то в общем-то не должно было таких записей образоваться ни при каком раскладе....
7 июн 08, 14:31    [5776038]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
Это расшифруйте: "В какой-то у одного из пользователей процесс заканчивается."
7 июн 08, 14:32    [5776046]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
ИМХО все же надо смотреть на код
7 июн 08, 15:15    [5776359]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
sequence тут вообще не при чем
8 июн 08, 20:49    [5779146]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Nixic
Member

Откуда: Perm
Сообщений: 2015
wildwind
Это расшифруйте: "В какой-то у одного из пользователей процесс заканчивается."

В какой-то момент, наверное
9 июн 08, 07:31    [5779828]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
stax..
Guest
Dimkas
Здравствуйте!
Понятно, что баг скорее всего в нашей проге, но хотелось бы спросить у общественности -
не сталкивался ли кто с подобным? :)

если поле действительно ПК то двух записей с 0 не может быть
искать битые блоки, баги, ....

если поле не ПК смотрите внимательно как присваивается
ps
последовательность надеюсь никто не пересоздает в ето время
......
stax
9 июн 08, 11:23    [5780671]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Akarak2
Member

Откуда:
Сообщений: 201
А может в момент обращения к последовательности происходит, сбой.
И вы поэтому получете 0
Как происходит обращение к последовательности в вашей программе?
Через функцию
или select xxx.nextval ....
?
9 июн 08, 11:34    [5780751]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Akarak2
Member

Откуда:
Сообщений: 201
Попробуйте так
CREATE OR REPLACE PACKAGE MY IS
FUNCTION SEQ_N
  return number;
  
FUNCTION SEQ_C
  return number;

END MY;
/

CREATE OR REPLACE PACKAGE BODY MY AS

  FUNCTION SEQ_N
  return number
  IS
  result number(38);
begin
  SELECT NUM_S.nextval
  into result
  FROM DUAL;
  return(result);
exception
  when others then
    return(-1);

  END;
  FUNCTION SEQ_C
  return number
  IS
  result number(38);
begin
  SELECT NUM_S.currval
  into result
  FROM DUAL;
  return(result);
exception
  when others then
    return(-1);

  END;  
END MY;
/
ну и соответственно вызов
SELECT MY.SEQ_C FROM DUAL 
WHERE MY.SEQ_N>0;
9 июн 08, 11:44    [5780835]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
to stax.
поле имеет ограничение PRIMARY KEY - но от одной ошибки до другой значение "0" убирается руками :)

идея с пересозданием sequence вполне реальная,
пока будем её проверять...

с уважением,
Дмитрий Жучков
9 июн 08, 14:02    [5781971]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
seq
Guest
Если start with = 899452, то каким образом вообще у тебя значения меньше получаются?

Не может такого быть. Значит другим каким-то способом ещё генерируются значения.
9 июн 08, 14:14    [5782077]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Pir
Member

Откуда: Москва
Сообщений: 872
у вас на этом поле наверное стоит default 0
и кто-то переодически добавляет запись, забывая про PK
добавьте триггер на заполнение PK из сиквенса и не мучайтесь
create or replace trigger ..
 before insert on ..
 for each row
begin
 if :new.ваше_поле is null then
  select RQRT_KEY.nextval into :new.ваше_поле from dual;
 end if;
end;
9 июн 08, 14:15    [5782079]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
_slow=false
Member

Откуда: x$ksppcv
Сообщений: 88
Akarak2
...
Твое предложение делать это через жопу удивительным образом соответствует нику ;-)
9 июн 08, 14:30    [5782217]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Lecter
Member

Откуда: Киев
Сообщений: 2032
Pir
у вас на этом поле наверное стоит default 0
и кто-то переодически добавляет запись, забывая про PK
добавьте триггер на заполнение PK из сиквенса и не мучайтесь
create or replace trigger ..
 before insert on ..
 for each row
begin
 if :new.ваше_поле is null then
  select RQRT_KEY.nextval into :new.ваше_поле from dual;
 end if;
end;


Поддерживаю, триггер решение всех ваших проблем...
9 июн 08, 14:49    [5782354]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63932
Блог
Akarak2

exception
when others then
return(-1);

А потом люди начинают гадать, откуда вдруг в ключе нули появляются :)

Pir
у вас на этом поле наверное стоит default 0
и кто-то переодически добавляет запись, забывая про PK
добавьте триггер на заполнение PK из сиквенса и не мучайтесь

Я бы скорее сказал "уберите дефолт".
9 июн 08, 14:55    [5782414]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63932
Блог
seq
Если start with = 899452, то каким образом вообще у тебя значения меньше получаются?

Ты не на то обращаешь внимание. start with 899452 означает всего лишь, что этот ddl взят не из того скрипта, которым создавалась последовательность, а получен чем-нибудь типа PL/SQL Developer / View As SQL и 899452 - текущее значение.
9 июн 08, 14:59    [5782453]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
seq
Guest
softwarer
seq
Если start with = 899452, то каким образом вообще у тебя значения меньше получаются?

Ты не на то обращаешь внимание. start with 899452 означает всего лишь, что этот ddl взят не из того скрипта, которым создавалась последовательность, а получен чем-нибудь типа PL/SQL Developer / View As SQL и 899452 - текущее значение.


это потому что я как девелопер - никогда не беру описания объектов из БД, а беру их из своих скриптов.
9 июн 08, 15:17    [5782609]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Pir
Member

Откуда: Москва
Сообщений: 872
seq

это потому что я как девелопер - никогда не беру описания объектов из БД, а беру их из своих скриптов.

а ещё лучше брать их из системы управления версиями :)
9 июн 08, 15:20    [5782644]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
list-er
Guest
Pir
seq

это потому что я как девелопер - никогда не беру описания объектов из БД, а беру их из своих скриптов.

а ещё лучше брать их из системы управления версиями :)


Лучше. Когда есть необходимость их использования
9 июн 08, 15:22    [5782664]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
stax..
Guest
Lecter

Поддерживаю, триггер решение всех ваших проблем...

триггер конечно неплохо
но у них заливка данных и триггера будут тормозить
разве что попробовать c
of id is null or id=0
но я не уверен что не будет тормозить

мона создать триггер для поиска ошибки, потом убрать

но ведь и так ошибку мона отловить оставив запись с 0
или создав ее штучно для отлова дубликате

.....
stax
9 июн 08, 18:56    [5784333]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Andrei Ditiatev
Member

Откуда: New York
Сообщений: 12
И как Вы думаете, насколько сильно триггер затормозит Ваш процесс по сравнению с текущей ситуацией да и со временем поиска и фикса бага(ов) и добавлением новых ? :)
9 июн 08, 19:20    [5784406]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
stax..
Guest
Andrei Ditiatev
И как Вы думаете, насколько сильно триггер затормозит Ваш процесс по сравнению с текущей ситуацией да и со временем поиска и фикса бага(ов) и добавлением новых ? :)

у меня сильно тормозил
в разы
.....
stax
9 июн 08, 19:45    [5784463]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Andrei Ditiatev
Member

Откуда: New York
Сообщений: 12
Staxx,
т.е. Вы хотите сказать, что "время вычитывания сиквенса из базы в приложение + внутреннее время приложения по формированию набора INSERT'ов + время вставки" меньше чем "внутреннее время приложения по формированию набора INSERT'ов + время вставки + время работы триггера" в разы ? :)
9 июн 08, 21:43    [5784733]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
Pir
Member

Откуда: Москва
Сообщений: 872
если в триггере только заполнение pk - тормозить не будет, но если в триггер добавить ненужный поиск ошибки (авт. транзакция, поиск дубликата и raise Найден баг! Бегом к администратору!), то скорость упадет на порядки. ошибку мы и так получим из-за pk.
9 июн 08, 21:51    [5784745]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение SEQUENCE  [new]
stax..
Guest
Andrei Ditiatev
Staxx,
т.е. Вы хотите сказать, что "время вычитывания сиквенса из базы в приложение + внутреннее время приложения по формированию набора INSERT'ов + время вставки" меньше чем "внутреннее время приложения по формированию набора INSERT'ов + время вставки + время работы триггера" в разы ? :)

именно сказать, а не утверждать
использование последовательности в операторах insert (в лоадере)
было быстрее в разы чем в триггерах
на седьмом оракле (кажись 7.3)


ps
счас девятка не проверял
pss
ведь ето очень просто проверить
.....
stax
9 июн 08, 21:54    [5784753]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить