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

У меня вопрос по поводу самого грамотного способа извлечения ID (serial) последней вставленной в таблицу записи.

Если запрашивать currval(table_id_seq), будет ли это корректно?

Нужно выполнить:

1. вставку новой записи в таблицу Т1.
2. Потом извлечение IDшки вставившейся записи,
3. и дальшейшее ее использование.

Допустим вышеперечисленные действия выолняются внутри одной транзакции.
Если одновременно запускаются две трнзакции, добавляют по одной записи в T1. Так как каждая транзакция до своего закрытия не видит изменений, сделанных другой, то в обеих транзакциях currval возвратит одинаковые значения.

Я наверное что-то не понимаю. Объясните, пожалуйста.
...
Рейтинг: 0 / 0
Транзакции
    #32824326
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КвиточкаПривет!

У меня вопрос по поводу самого грамотного способа извлечения ID (serial) последней вставленной в таблицу записи.

Зависит от языка хранимой процедуры. Тебе по pl/pgsql или про С/С++ (я по другому не умею :-( ) ?
...
Рейтинг: 0 / 0
Транзакции
    #32824489
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квиточка
T1. Так как каждая транзакция до своего закрытия не видит изменений, сделанных другой, то в обеих транзакциях currval возвратит одинаковые значения.

если б это было так для всех объектов базы, использование счетчиков было бы невозможным (убийственным) в сетевой работе (как правило - они еще и уникумы - т.е. суррогатные праймери кеи). По моим наблюдениям счетчики нарастают независимо от роллбаков или коммитов. И поэтому некствал возвращает некое наперед определенное значение только одной транзакции (если счетчик специально не переинициализировать). Т.е. счетчики тут (по отношению видимости изменений) отличаются от таблиц. Но каррвал вернет только последний некствал сделанный в текущей сессии. Будут ли у вас 2 одновременные транзакции в одной сессии (т.е. 2 нити/процесса, но в "одной сессии" - да и возможно ли такое в смысле "сессии" постгреса?), и что при этом случится (когад вы одновременно обратитесь за каррвалом) - не берусь ответить - не знаю.
...
Рейтинг: 0 / 0
Транзакции
    #32826265
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУ меня вопрос по поводу самого грамотного способа извлечения ID (serial) последней вставленной в таблицу записи.
хранимая процедура тебя спасет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE public.my_table
(
  id serial NOT NULL PRIMARY KEY,
  name varchar( 60 ) NOT NULL
);

CREATE OR REPLACE FUNCTION public.insert_my_table(varchar)
  RETURNS int8 AS
'
declare
  new_id int8;
begin
  new_id := nextval(\'public.my_table_id_seq\');
  insert into my_table(id, name) values (new_id, $1);
  return new_id;
end;
'
  LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
Транзакции
    #32826981
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemA хранимая процедура тебя спасет
...
[/src]
хм. А это не велосипед с квадратными колесами? currval, судя по документации, вполне справляется с задачей (возврата последнего значения счетчика присвоенного в данной сессии).
Если нет - желательно поподробнне, как можно нарыть баг с currval.
...
Рейтинг: 0 / 0
Транзакции
    #32827206
Точно. currval справляется как надо.
...
Рейтинг: 0 / 0
Транзакции
    #32827598
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
до вызова nextval, явного или неявного, сurrval не работает . Подробнее читайте описание currval - возвращает последнее значение которое было в nextval
...
Рейтинг: 0 / 0
Транзакции
    #32827804
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 ZemA хранимая процедура тебя спасет
...
[/src]
хм. А это не велосипед с квадратными колесами? currval, судя по документации, вполне справляется с задачей (возврата последнего значения счетчика присвоенного в данной сессии).
Если нет - желательно поподробнне, как можно нарыть баг с currval.
были какие-то проблеммы и я стал делать ч/з хп.
сейчас же, потестировав конструкцию,
Код: plaintext
1.
insert into my_table(name) values ('бла бла бла');
select currval('my_table_id_seq');
прихожу к выводу что currval работает как надо.
хотя в принципе тип serial это на самом деле int8 NOT NULL DEFAULT nextval('sequence') , так что какая разница
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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