powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / есть ли гарантия?
10 сообщений из 10, страница 1 из 1
есть ли гарантия?
    #33034663
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте.
У меня есть PL-функция, в которой выполняется след. код:

Код: plaintext
1.
2.
INSERT INTO client (place_id, client_login) VALUES (_place_id, _login);
SELECT INTO ret max(client_id) FROM liveclients;
RETURN ret;

есть ли гарантия, что функия вернет именно тот ид, который добавил я, а не кто-то другой.
я слышал вроде, что выполнение функции - это отдельная транзакция, то есть по идее должно быть все нормально?
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33034697
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую

если client_id типа serial или ты используешь sequence для присвоения ему значения
воспользуйся функцией nextval('имя сиквенса')
100% получишь свой ид
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33034947
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кабан Савраскинесть ли гарантия, что функия вернет именно тот ид, который добавил я, а не кто-то другой.

Не факт!!! Только если уровень изоляции транзакция serializable!!!
По умолчанию уровень изоляции Read Commited, а значит, если другая транзакция, выполняющая INSERT, скоммитилась между нашими INSERT и SELECT, то наш селект вернет именно его client_id.

Если я не ошибаюсь, процедуры(функции) работают в вызвавшей их транзакции. Если нет явного указания транзакции (begin; commit;), то каждый запрос на клиенте - отдельная транзакция (с уровнем изоляции по умолчанию).

В процедуре нельзя изменить уровень изоляции, значит либо все транзакции, где используется ф-ия, помечаешь Serializable, либо (если пара place_id,client_login уникальна) делаешь
Код: plaintext
SELECT INTO ret max(client_id) FROM liveclients WHERE place_id = _place_id AND client_login=_login;

lionsonесли client_id типа serial или ты используешь sequence для присвоения ему значения
воспользуйся функцией nextval('имя сиквенса')
Блин... Только догадался... Lionson ты абсолютно прав!!! Только функцию наверно имел в виду currval('имя сиквенса'). Тогда код выглядит:
Код: plaintext
1.
2.
INSERT INTO client (place_id, client_login) VALUES (_place_id, _login);
SELECT INTO ret currval('имя сиквенса');
RETURN ret;
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33035558
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точно, извени ошибся
конечно currval
она отслеживает изменения только в пределах сессии
и если к примеру ты ни разу ее не затронешь, то при вызове она ругнется, что де мол в данной сессии не было обращения к указанному сиквенсу
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33037095
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В подобных случаях я предпочитаю делать таблицу WITH OIDS и в ХП делать

get diagnostics r=RESULT_OID;
select ... where oid=r;
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33037317
Фотография Radjaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть то, что функция выполняется как отдельная транзакция не дает никаких гарантий, что код вернет нужный ид?
спасибо всем за ответы. сделал currval
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33037523
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Radjamanто есть то, что функция выполняется как отдельная транзакция не дает никаких гарантий, что код вернет нужный ид?

Да. Гарантии появятся (точнее могут появиться) как только будет установлен соответствующий уровень изолированности транзакции. А currval() - будет работать для любого уровня.
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33044290
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeron Radjamanто есть то, что функция выполняется как отдельная транзакция не дает никаких гарантий, что код вернет нужный ид?

Да. Гарантии появятся (точнее могут появиться) как только будет установлен соответствующий уровень изолированности транзакции. А currval() - будет работать для любого уровня.

Интересно почему это? А если между первым и вторым селектом произошла вставка строки?

Япредпочитаю вставлять данные в таблицу через функцию и там уже сам беру значение nextval(...). Соответственно возвращаю id или ошибку.
Мне кажется так надежнее. Столкнулся с такой проблемой еще в мсскл,и решил больше не делать автоматику там где мне нужно будет получить идентификатор вставленной строки.
Кстати можено ведь не serial тип устанавливать, а в значении по умолчанию делать nextval(...), тогдагде нужно будет вернуть значение ид, просто сам получаешь nextval изнужной последовательности и в ручную его вставляешь. В остальных случаях это делается автоматически.
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33045599
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximZ Andrey Daeron currval() - будет работать для любого уровня.

Интересно почему это?

по оперделению.
Читайте хелп по currval()
MaximZ
Япредпочитаю
еще один любитель трусы через голову натягивать.
Стоит ли навязывать своих тараканов другим ?
...
Рейтинг: 0 / 0
есть ли гарантия?
    #33048175
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximZ
Япредпочитаю вставлять данные в таблицу через функцию и там уже сам беру значение nextval(...). Соответственно возвращаю id или ошибку.
Мне кажется так надежнее. Столкнулся с такой проблемой еще в мсскл,и решил больше не делать автоматику там где мне нужно будет получить идентификатор вставленной строки.
Кстати можено ведь не serial тип устанавливать, а в значении по умолчанию делать nextval(...), тогдагде нужно будет вернуть значение ид, просто сам получаешь nextval изнужной последовательности и в ручную его вставляешь. В остальных случаях это делается автоматически.

Вы меня пугаете.
Столкнулся с такой проблемой еще в мсскл,и решил больше не делать автоматику там где мне нужно будет получить идентификатор вставленной строки.
@@IDENTITY отменили? Полный аналог curval-а. Если с ним были какие-то проблемы, то расскажите о них - мне интересно. Хотя, пожалуй, этот вопрос из другой ветки.)))
Кстати можено ведь не serial тип устанавливать, а в значении по умолчанию делать nextval(...),
А что по вашему SERIAL делет? То же самое - создаёт сиквенс и вставляет соответствующую строку в дефаулт поля. Зачем же это делать руками?
Япредпочитаю вставлять данные в таблицу через функцию
При сотне таблиц в схеме можно подзадолбаться, ИМХО.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / есть ли гарантия?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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