Насколько "thread-safe" вызов LASTVAL() ?

untied

Сдвинутый новичок
Ситуация вполне стандартная. Есть таблица, первичный ключ задается SERIAL. Вставляем новую запись, затем извлекаем получившийся идентификатор записи с помощью вызова SELECT LASTVAL().

Задался вопросом, насколько безопасен подобный подход на высоконагруженном сайте. Ведь в функцию LASTVAL() даже не передается название последовательности. Т.е. вполне возможна ситуация, когда два-три и более пользователей практически одновременно добавляют запись в БД (причем не обязательно в одну и ту же таблицу), и что им тогда вернет LASTVAL() ? Не могут ли идентификаторы перепутаться?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Как же задолбал этот вопрос. Рекомендую провести простой тест: открыть две консоли к PostgreSQL, попробовать что-нибудь перепутать.

(currval() / lastval() работает для конкретного подключения к БД. Поэтому абсолютно неважно, что делают "два-три и более пользователей" в параллельных подключениях)
 

alekciy

Новичок
Задался вопросом, насколько безопасен подобный подход на высоконагруженном сайте.
SEQUENCE для того и придумали, что это безопасно на "высоконагруженном сайте". Сколько бы сессий не было, в SEQUENCE ни когда не будет коллизий. Даже более того, там заложена такая полезная, для высоконагруженных проектов, штука как cache. Если известно, что в приложении в течении сессии может потребоваться Х идентификаторов, то их можно под себя сразу и получить. В общем из документации:

Furthermore, although multiple sessions are guaranteed to allocate distinct sequence values, the values might be generated out of sequence when all the sessions are considered. For example, with a cache setting of 10, session A might reserve values 1..10 and return nextval=1, then session B might reserve values 11..20 and return nextval=11 before session A has generated nextval=2. Thus, with a cache setting of one it is safe to assume that nextval values are generated sequentially; with a cache setting greater than one you should only assume that the nextval values are all distinct, not that they are generated purely sequentially. Also, last_value will reflect the latest value reserved by any session, whether or not it has yet been returned by nextval.
 

untied

Сдвинутый новичок
Дело не в коллизиях. Это понятно, что каждый вызов NEXTVAL() выдает очередное значение, без повторений. Меня внезапно смутил вызов LASTVAL() без каких-либо параметров. Но, судя по всему, все работает как и следует ему работать. Гугление по запросу "thread-safe LASTVAL()" никаких воплей ужаса не диагностировало. :D
 
Сверху