Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Duplicate key - откуда? / 20 сообщений из 20, страница 1 из 1
15.08.2016, 14:53
    #39292010
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
Есть таблица и функция,
ошибка добулирования значения ключа возникает странно и неопределенно, скажем сделал новую базу, первый раз вызвал
функцию, получил ошибку, тут же второй раз вызываю - ошибки нет
Как такая ошибка может возникнуть в принципе в такой функции, там же проверка вроде есть?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE public.u_names (
  u_id SERIAL,
  u_name VARCHAR(256),
  CONSTRAINT u_names_pkey PRIMARY KEY(u_id)
) 
WITH (oids = false);


CREATE OR REPLACE FUNCTION public.get_client_name (
)
RETURNS varchar AS
$body$
DECLARE str_name TEXT;
begin
IF NOT EXISTS(select 1 from u_names where u_name=CURRENT_USER)
THEN
   insert into u_names(u_name) values(CURRENT_USER);
END IF;
str_name := current_user;
return str_name;
end;
$body$
LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
15.08.2016, 15:04
    #39292028
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
Ролг ХупинКак такая ошибка может возникнутьРазработчик баз данных должен обладать достаточной фантазией, чтобы понять, как работают уровни изоляции.
Убери проверку if, она и так сработает по констрейнту.
...
Рейтинг: 0 / 0
15.08.2016, 16:20
    #39292092
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
p2.,
UNIQUE по name не наблюдаю.
...
Рейтинг: 0 / 0
15.08.2016, 16:53
    #39292123
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
Ролг Хупин,

А каким образом вызывается функция? Может быть, что какой-то скрипт в кроне фигачит по всем доступным базам?
Настройки изоляции какие? Версия какая? Функция не перегружена?
...
Рейтинг: 0 / 0
15.08.2016, 16:56
    #39292126
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
qwwqUNIQUE по name не наблюдаю.Противоречий в показаниях пациента хватает. Но это не отменяет бесполезность проверяющего селекта перед инсертом.
...
Рейтинг: 0 / 0
15.08.2016, 17:05
    #39292139
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
p2.,

согласен. не хватает либо unique + exception when unique_violation или модного INSERT ... ON CONFLICT ...

а так -- он просто руками вставил в id , думаецца
...
Рейтинг: 0 / 0
15.08.2016, 19:55
    #39292244
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
...
Рейтинг: 0 / 0
15.08.2016, 20:22
    #39292252
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
Ролг ХупинЕсть таблица и функция,
ошибка добулирования значения ключа возникает странно и неопределенно, скажем сделал новую базу, первый раз вызвал
функцию, получил ошибку, тут же второй раз вызываю - ошибки нет
Как такая ошибка может возникнуть в принципе в такой функции, там же проверка вроде есть?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE public.u_names (
  u_id SERIAL,
  u_name VARCHAR(256),
  CONSTRAINT u_names_pkey PRIMARY KEY(u_id)
) 
WITH (oids = false);


CREATE OR REPLACE FUNCTION public.get_client_name (
)
RETURNS varchar AS
$body$
DECLARE str_name TEXT;
begin
IF NOT EXISTS(select 1 from u_names where u_name=CURRENT_USER)
THEN
   insert into u_names(u_name) values(CURRENT_USER);
END IF;
str_name := current_user;
return str_name;
end;
$body$
LANGUAGE 'plpgsql';



если дублирование u_id
то у вас в свежей базе в public.u_names уже что то внесено и какие то u_id использованы (скорее всего 1)
а значение sequence для u_id SERIAL - равно нулю вот первый раз вы и получаете ошибку пока оно sequence прокручивает.
Почитайте про внутреннюю организацию serial:
https://www.postgresql.org/docs/9.5/static/datatype-numeric.html#DATATYPE-SERIAL


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
16.08.2016, 09:29
    #39292377
PgSQLanonymous2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
[quot p2.]qwwqНо это не отменяет бесполезность проверяющего селекта перед инсертом.
От уровня изоляции зависит. На SERIALIZABLE полезен.
...
Рейтинг: 0 / 0
16.08.2016, 10:26
    #39292411
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
PgSQLanonymous2,

//умного учить, только портить, жгите дальше

но там же будет в той же ситуации (конкурирующий коммит после старта) тот же эксепшен, только уже про пробитие уровня изоляции, а не уникъю. нет ?


PS поцгресс атлично протекает на ддл-ях по уровням изоляции. во первых при накате ддл ф--й. во вторых -- по криейт тейбл (второе -- по крайней -- в рипитебл , дальше стало не интересно). печаль.
...
Рейтинг: 0 / 0
16.08.2016, 13:35
    #39292575
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
Maxim BogukРолг ХупинЕсть таблица и функция,
ошибка добулирования значения ключа возникает странно и неопределенно, скажем сделал новую базу, первый раз вызвал
функцию, получил ошибку, тут же второй раз вызываю - ошибки нет
Как такая ошибка может возникнуть в принципе в такой функции, там же проверка вроде есть?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE public.u_names (
  u_id SERIAL,
  u_name VARCHAR(256),
  CONSTRAINT u_names_pkey PRIMARY KEY(u_id)
) 
WITH (oids = false);


CREATE OR REPLACE FUNCTION public.get_client_name (
)
RETURNS varchar AS
$body$
DECLARE str_name TEXT;
begin
IF NOT EXISTS(select 1 from u_names where u_name=CURRENT_USER)
THEN
   insert into u_names(u_name) values(CURRENT_USER);
END IF;
str_name := current_user;
return str_name;
end;
$body$
LANGUAGE 'plpgsql';



если дублирование u_id
то у вас в свежей базе в public.u_names уже что то внесено и какие то u_id использованы (скорее всего 1)
а значение sequence для u_id SERIAL - равно нулю вот первый раз вы и получаете ошибку пока оно sequence прокручивает.
Почитайте про внутреннюю организацию serial:
https://www.postgresql.org/docs/9.5/static/datatype-numeric.html#DATATYPE-SERIAL


--
Maxim Boguk
www.postgresql-consulting.ru


в точку! спасибо!

генератор скриптов прикрутил в конце - все sequence стартуют с 1, а в некоторых таблицах уже есть данные.
...
Рейтинг: 0 / 0
16.08.2016, 18:35
    #39292816
PgSQLanonymous2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
qwwqPgSQLanonymous2,
//умного учить, только портить, жгите дальше

Чему у Вас учиться-то, гланды автогеном удалять? ;)

qwwqно там же будет в той же ситуации (конкурирующий коммит после старта) тот же эксепшен, только уже про пробитие уровня изоляции, а не уникъю. нет ?

Да, и в этом-то и радость. Когда транзакция получает duplicate key, непонятно, "настоящий" он или из-за соседней транзакции, в отличие от "про пробитие уровня изоляции".

qwwqPS поцгресс атлично протекает на ддл-ях по уровням изоляции. во первых при накате ддл ф--й. во вторых -- по криейт тейбл (второе -- по крайней -- в рипитебл , дальше стало не интересно). печаль.
А пример(ы) можно?
...
Рейтинг: 0 / 0
16.08.2016, 18:40
    #39292822
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
PgSQLanonymous2Когда транзакция получает duplicate key, непонятно, "настоящий" он или из-за соседней транзакцииПоясни.
...
Рейтинг: 0 / 0
16.08.2016, 19:00
    #39292831
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
PgSQLanonymous2А пример(ы) можно?

бисер вам противопоказан.
...
Рейтинг: 0 / 0
16.08.2016, 20:02
    #39292857
PgSQLanonymous2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
p2.PgSQLanonymous2Когда транзакция получает duplicate key, непонятно, "настоящий" он или из-за соседней транзакцииПоясни.

-- Версия PostgreSQL 9.5.0, если что. Цифрами обозначены транзакции.
CREATE TABLE Test(n INT PRIMARY KEY, v INT NOT NULL);

1. BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
1. INSERT INTO Test VALUES (1, 2);
2. BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
2. SAVEPOINT a;
2. INSERT INTO Test VALUES (1, 3);
1. COMMIT;

Далее 2 получает:

ERROR: duplicate key value violates unique constraint "test_pkey"

-- Хмм, ну значит такая запись есть, сейчас обновим:
. ROLLBACK TO a;
. UPDATE Test SET v = 3 WHERE n = 1;
Query returned successfully: 0 rows affected ...

Что?! Что ты несёшь, PostgreSQL?
Запись есть, но её нет!? ;)

А если серьёзнее, в случае возникновения подобной ситуации непонятно,
то ли действительно уже существовала эта запись, то ли другая транзакция "удружила".

Если в этой ситуации возникает serialization failure, можно повторять транзакцию,
что особенно удобно, если уже есть какой-то framework для обработки
исключительных ситуаций при работе с СУБД.
...
Рейтинг: 0 / 0
16.08.2016, 20:03
    #39292858
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
p2.qwwqUNIQUE по name не наблюдаю.Противоречий в показаниях пациента хватает. Но это не отменяет бесполезность проверяющего селекта перед инсертом.

да, уберу, это "отрыжка" T-SQL
...
Рейтинг: 0 / 0
16.08.2016, 20:07
    #39292861
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
qwwqp2.,
UNIQUE по name не наблюдаю.

хмм, да, есть смысл добавить.
...
Рейтинг: 0 / 0
16.08.2016, 20:11
    #39292863
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
PgSQLanonymous2,

Если можно, прокомментируйте мою функцию, если она бдцует вызываться многими юзерами,
я уровень изоляции не менял, дефолтный.
Есть ли смысл что-то в ней менять?
Хочу понять принципиально, может есть какой-то Best practice стиль написания функций, который мне не известен
...
Рейтинг: 0 / 0
16.08.2016, 22:12
    #39292903
PgSQLanonymous2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
Ролг ХупинPgSQLanonymous2,
Если можно, прокомментируйте мою функцию, если она бдцует вызываться многими юзерами,

Нельзя. ;) Вот из-за этого:
Ролг Хупиня уровень изоляции не менял, дефолтный.

Вы выбрали свой путь, так и идите по нему до конца, а я лично считаю, что "this is the road to hell".
Можете поучиться у qwwq вырезанию гланд автогеном. ;)

Ролг ХупинЕсть ли смысл что-то в ней менять?
Хочу понять принципиально, может есть какой-то Best practice стиль написания функций, который мне не известен
Да, есть, и он описан вот здесь:
https://www.postgresql.org/docs/current/static/transaction-iso.html#XACT-SERIALIZABLE

(Ну а сейчас Вам тут, наверное, расскажут, что всё это чушь,
и разработчики PostgreSQL в этом ничего не понимают, а делать надо наоборот.)
...
Рейтинг: 0 / 0
16.08.2016, 22:48
    #39292913
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Duplicate key - откуда?
PgSQLanonymous2Ролг ХупинPgSQLanonymous2,
Если можно, прокомментируйте мою функцию, если она бдцует вызываться многими юзерами,

Нельзя. ;) Вот из-за этого:
Ролг Хупиня уровень изоляции не менял, дефолтный.

Вы выбрали свой путь, так и идите по нему до конца, а я лично считаю, что "this is the road to hell".
Можете поучиться у qwwq вырезанию гланд автогеном. ;)

Ролг ХупинЕсть ли смысл что-то в ней менять?
Хочу понять принципиально, может есть какой-то Best practice стиль написания функций, который мне не известен
Да, есть, и он описан вот здесь:
https://www.postgresql.org/docs/current/static/transaction-iso.html#XACT-SERIALIZABLE

(Ну а сейчас Вам тут, наверное, расскажут, что всё это чушь,
и разработчики PostgreSQL в этом ничего не понимают, а делать надо наоборот.)

как минимум про гланды - не, это не наш путь, пусть сам рвёт
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Duplicate key - откуда? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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