On 07/12/2012 04:17 AM, Steve Crawford wrote:

The stickier issue is queuing. You have multiple users and need to ensure that you grab an unused check from the book but each concurrent user needs to get a different check. "Select from checkbook where not check_used order by check_no limit 1 for update" seems like a reasonable approach but if two users run it simultaneously the first user will get 1 check and succeed while the second user will attempt to lock same check record, block until the first user completes then recheck and find the selected record no longer meets the check_used criteria so the second user will see zero records returned.
In short-transaction systems where the blocking isn't an issue it's often fine to just re-try when you don't get a result. Much simpler than advisory locking tricks.

Using a SERIALIZABLE transaction should also work AFAIK, causing a serialization failure and forcing the app to re-issue the transaction.

--
Craig Ringer

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to