powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Загадка Serial
24 сообщений из 24, страница 1 из 1
Загадка Serial
    #38419649
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сижу, чешу репу в непонятках.

IBM Informix Dynamic Server Version 11.70.FC7

Имеется таблица с первичным ключом типа SERIAL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table "informix".portal_user_access
  (
    portal_user_access_id serial not null ,
    portal_role_group_id integer not null ,
    portal_user_id integer not null ,
...
  );

create unique index "informix".idx_portal_user_acc_pk on "informix"
    .portal_user_access (portal_user_access_id) using btree ;

alter table "informix".portal_user_access add constraint primary
    key (portal_user_access_id) constraint "informix".pk_portal_user_access
     ;



Имеется процедура для обслуживания таблицы :
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE "informix".add_portal_user (p_owner_number INT,

...
  INSERT INTO portal_user_access
  (portal_role_group_id, portal_user_id, owner_number, ext_sys_id, primary_own, main_access)
  VALUES
  (8, l_portal_user_id, p_owner_number, p_ext_sys_id, 1, 1);



То есть portal_user_access_id в INSERT не указан и, стало быть, должен заполняться автоматически.

И имеется java приложение, которое в логах записало

call add_portal_user(22590083,...)

WARN com.intercall.applications.owner.IOL.AceOwnerIOLDAO - persistIOLProfile() RETURN CODE= -268 MESSAGE=informix.pk_portal_us
er_access [ownerNumber=xxxxxxx userTypeId 4 userName = 11111111 password = 222222 salt =xxxxxx externalOwnerId = 3333
2240 externalSystemId= 5]

Код 268 - это
268 Unique constraint <constraint-name> violated.

During execution of this statement, a duplicate value was introduced
into a column or columns that a unique constraint protects.


Вот этого я понять не могу.
Ну ладно, допустим, кто-то загрузил в таблицу строку с PK = 100, например. Вперед по номеру. И мы, идя от 1, на очередном INSERTе на нее напарываемся.
Но фишка с SERIAL в том, что после такой загрузки следующим значением автоматически становится 101, и мы не можем получить дупликат...

Грешу на баг в обработке SERIAL в транзакциях, если такой имеется...
...
Рейтинг: 0 / 0
Загадка Serial
    #38419692
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВыбегаллоСижу, чешу репу в непонятках.
...
Грешу на баг в обработке SERIAL в транзакциях, если такой имеется...

Репликация присутствует ? (HDR или ER)
...
Рейтинг: 0 / 0
Загадка Serial
    #38419996
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SERIAL есть баг на фрагментированных таблицах после добавления очередного фрагмента.
...
Рейтинг: 0 / 0
Загадка Serial
    #38420697
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victor16ВыбегаллоСижу, чешу репу в непонятках.
...
Грешу на баг в обработке SERIAL в транзакциях, если такой имеется...

Репликация присутствует ? (HDR или ER)

Присутствует HDR.
...
Рейтинг: 0 / 0
Загадка Serial
    #38420700
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IkirВ SERIAL есть баг на фрагментированных таблицах после добавления очередного фрагмента.

таблица нефрагментированная :

create table "informix".portal_user_access
...
) in brand_t extent size 7024 next size 32 lock mode row;
...
Рейтинг: 0 / 0
Загадка Serial
    #38420702
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВыбегаллоПрисутствует HDR.
read/write или read/only ?
...
Рейтинг: 0 / 0
Загадка Serial
    #38420730
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victor16ВыбегаллоПрисутствует HDR.
read/write или read/only ?

read only
...
Рейтинг: 0 / 0
Загадка Serial
    #38420739
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка одноразовая или встречается постоянно?
...
Рейтинг: 0 / 0
Загадка Serial
    #38420789
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victor16Ошибка одноразовая или встречается постоянно?

Одноразовая.
...
Рейтинг: 0 / 0
Загадка Serial
    #38420807
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
Выбегалло,

HADR не падал ?
Есть ли возможность опустить хадр повторить операцию и поднять его по новой через восстановление.

Ну и дурацкий вопрос - есть еще уникальные ограничения на таблицу?

Ну или триггеры с вызовом хранимых процедур?
...
Рейтинг: 0 / 0
Загадка Serial
    #38420812
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cprВыбегалло,

HADR не падал ?
Есть ли возможность опустить хадр повторить операцию и поднять его по новой через восстановление.

Ну и дурацкий вопрос - есть еще уникальные ограничения на таблицу?

Ну или триггеры с вызовом хранимых процедур?

Это продакшн, так что никто не даст экспериментировать. HDR не падал.
Уникальный индекс только один.
Триггеры есть, но в процедурах, навешенных на эти триггеры, нет INSERT в эту таблицу, и нет INSERT в другие таблицы с триггерами.
...
Рейтинг: 0 / 0
Загадка Serial
    #38420846
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если не секрет, сколько записей в таблице?
...
Рейтинг: 0 / 0
Загадка Serial
    #38420858
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victor16А если не секрет, сколько записей в таблице?

1286999. О переполнении речь не идет.
...
Рейтинг: 0 / 0
Загадка Serial
    #38420869
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мдя, вроде все что знал про SERIAL, все спросил.
Действительно похоже на баг.
А дополнительные поля в таблице типа ER Shadow, Vercols присутствуют? В свое время у меня с ними было много мороки, вплоть до падения сервера.

В качестве workaround могу посоветовать ON EXCEPTION.
...
Рейтинг: 0 / 0
Загадка Serial
    #38420916
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще пару слов. Решил освежить свои знания по SERIAL и к своему удивлению обнаружил:
Inserting Values into Serial Columns v.11.70FC7
To insert a consecutive serial value
Specify a zero (0) for the serial column in the INSERT statement. In this case, the database server assigns the next highest value.

И ни слова о другом старом общеизвестном способе, когда в списке INSERT сериальное поле просто пропускается.
Другими словами, сейчас для вставки следующего сериального значения нужно обязательно указать его в списке и передать значение 0. По крайней мере, так написано в документации по Вашей версии.
...
Рейтинг: 0 / 0
Загадка Serial
    #38441571
cpr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cpr
Гость
victor16,

А если поставить по умолчанию значение 0?
...
Рейтинг: 0 / 0
Загадка Serial
    #38441664
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cprvictor16,

А если поставить по умолчанию значение 0?

Код: sql
1.
2.
3.
>create table testtb (id serial not null default 0, txt char(20))

Cannot specify default value for SERIAL column.
...
Рейтинг: 0 / 0
Загадка Serial
    #38464317
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбегаллоvictor16Ошибка одноразовая или встречается постоянно?

Одноразовая.

Опять произошла.
...
Рейтинг: 0 / 0
Загадка Serial
    #38464487
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВыбегаллоОпять произошла.
Советую, таки, изменить код процедуры, типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE "informix".add_portal_user (p_owner_number INT,

...
  INSERT INTO portal_user_access
  (portal_user_access_id, portal_role_group_id, portal_user_id, owner_number, ext_sys_id, primary_own, main_access)
  VALUES
  (0, 8, l_portal_user_id, p_owner_number, p_ext_sys_id, 1, 1);


Хуже точно не будет. Возможно, механизм инициализации переменных по-умолчанию имеет баг.
Я вспоминаю, пару лет назад у меня встречалась такая же ситуация, правда, я не стал ее фиксить, поскольку программа была разработана таким образом, что в случае возникновения определенных ошибок, SQL-оператор тупо повторяется еще раз, если же ошибка возникает повторно, только в этом случае возникает exception (-746). В данном случае, повторное выполнение, как правило, должно быть успешным.
...
Рейтинг: 0 / 0
Загадка Serial
    #38615118
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВыбегаллоГрешу на баг в обработке SERIAL в транзакциях, если такой имеется...

Не решился вопрос ?
У меня похоже такая же беда, после отключения ER периодически возникает ошибка -268 на вставку 0 в SERIAL :(
...
Рейтинг: 0 / 0
Загадка Serial
    #38615247
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
victor16периодически возникает ошибка -268 на вставку 0 в SERIAL

Чаще всего встречается на вставку в таблицы, имеющие pending in-place alters.
...
Рейтинг: 0 / 0
Загадка Serial
    #38615877
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
victor16периодически возникает ошибка -268 на вставку 0 в SERIAL

У меня вылечилось просто:
Код: sql
1.
ALTER TABLE tabname MODIFY (colname SERIAL(max_of_colname+10))
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Загадка Serial
    #39687411
Serial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
victor16victor16периодически возникает ошибка -268 на вставку 0 в SERIAL

У меня вылечилось просто:
Код: sql
1.
ALTER TABLE tabname MODIFY (colname SERIAL(max_of_colname+10))



А что делает этот запрос?
...
Рейтинг: 0 / 0
Загадка Serial
    #39687416
Serial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А понял, просто увеличивает на 10 макс значение столбца serial.

Есть ли способы обхода этого бага?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Загадка Serial
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]