Re: Does setval(nextval()+N) generate unique blocks of IDs? - Mailing list pgsql-performance

From Tom Lane
Subject Re: Does setval(nextval()+N) generate unique blocks of IDs?
Date
Msg-id 13192.1345507800@sss.pgh.pa.us
Whole thread Raw
In response to Does setval(nextval()+N) generate unique blocks of IDs?  (Craig James <cjames@emolecules.com>)
Responses Re: Does setval(nextval()+N) generate unique blocks of IDs?  (Scott Marlowe <scott.marlowe@gmail.com>)
Re: Does setval(nextval()+N) generate unique blocks of IDs?  (Craig James <cjames@emolecules.com>)
List pgsql-performance
Craig James <cjames@emolecules.com> writes:
> I want to do this:

>     select setval('object_id_seq', nextval('object_id_seq') + 1000, false);

> Now suppose two processes do this simultaneously.  Maybe they're in
> transactions, maybe they're not.  Are they guaranteed to get distinct
> blocks of IDs?

No, because the setval and the nextval are not indivisible.

> Or is it possible that each will execute nextval() and
> get N and N+1 respectively, and then do setval() to N+1000 and N+1001,
> resulting in two overlapping blocks.

Exactly.

> If the answer is, "This won't work," then what's a better way to do this?

AFAIK the only way at the moment is

* acquire some advisory lock that by convention you use for this sequence
* advance the sequence
* release advisory lock

There have been previous discussions of this type of problem, eg
http://archives.postgresql.org/pgsql-hackers/2011-09/msg01031.php
but the topic doesn't seem to have come up quite often enough to
motivate anybody to do anything about it.  Your particular case could be
handled by a variant of nextval() with a number-of-times-to-advance
argument, but I'm not sure if that's enough for other scenarios.

            regards, tom lane


pgsql-performance by date:

Previous
From: Craig James
Date:
Subject: Does setval(nextval()+N) generate unique blocks of IDs?
Next
From: Scott Marlowe
Date:
Subject: Re: Does setval(nextval()+N) generate unique blocks of IDs?