Postgresql и PHP: является ли currval эффективным способом получения последней вставленной строки в многопользовательском приложении?

Мне интересно, эффективен ли способ, которым я использую идентификатор последней строки, вставленной в таблицу postgresql.

Это работает, очевидно, но ссылка на последовательную последовательность. Значение currval может быть проблематичным, когда у меня есть много пользователей, добавляющих строки в одну и ту же таблицу одновременно.

Мой фактический путь:

$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect'); $insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')"); $last_id_query = pg_query("SELECT currval('customer_id_seq')"); $last_id_results = pg_fetch_assoc($last_id_query); print_r($last_id_results); pg_close($pgConnection); 

Ну, это просто тест атм. Но так или иначе, я вижу 3 проблемы таким образом:

  1. Если ссылаться на customer_id_seq, если два пользователя делают одно и то же в одно и то же время, может случиться так, что они оба получат одинаковый идентификатор с этого пути … или нет?
  2. Я должен знать имя последовательности таблицы. Becose pg_get_serial_sequence не работает для меня (im новичок в postgresql, вероятно, проблема конфигурации)

Любое предложение / лучшие способы?

ps: я не могу использовать PDO, потому что, похоже, немного отстает от точки сохранения транзакций; Я не буду использовать zend, и, в конце концов, я предпочту использовать функции php pg_ * (возможно, в конце концов создам свои классы)

РЕДАКТИРОВАТЬ:

@SpliFF (он удалил свой ответ): это будет работать лучше?

 $pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect'); pg_query("BEGIN"); $insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')"); $last_id_query = pg_query("SELECT currval('customer_id_seq')"); $last_id_results = pg_fetch_assoc($last_id_query); print_r($last_id_results); //do somethings with the new customer id pg_query("COMMIT"); pg_close($pgConnection); 

Если вы используете более новую версию PostgreSQL (> 8.1), вы должны использовать предложение RETURNING команды INSERT (и UPDATE).

OTOH, если вы настаиваете на использовании одной из функций манипуляции последовательностями, пожалуйста, прочитайте точное руководство . Указатель: «Обратите внимание, что поскольку это возвращает локальное значение сеанса, оно дает предсказуемый ответ о том, выполнялись ли другие сеансы nextval с текущего сеанса».

Вставьте и проверьте curval (seq) внутри одной транзакции. Перед совершением транзакции вы увидите curval (seq) для вашего запроса и вне зависимости от того, кто еще вставил в одно и то же время.

Не помните синтаксис точно – читайте в ручном режиме (последний использованный pgsql около 3 лет назад), но в целом это выглядит так:

 BEGIN TRANSACTION; INSERT ...; SELECT curval(seq); COMMIT; 

ех. minsert в log (desc, user_id) значения («бросить вызов», 6) вернуть идентификатор