All pastes #927874 Raw Edit

Something

public text v1 · immutable
·published 2008-03-04 16:35 UTC
rendered paste body
The idea is to provide one global incrementing sequence number which is safe for concurrent access by multiple clients.
Schema ¶

A table with one record holds the "current value" of the sequence (value last given out).

	CREATE TABLE `OpSequence` (
		seqNumber BIGINT UNSIGNED
	) ENGINE=InnoDB;

Simply use more columns if more sequences are required (note that all sequences would be locked together, this way; this is unlikely to be an issue, otherwise use multiple tables).
Initialise ¶

	INSERT INTO OpSequence (seqNumber) VALUES (0);

Fetch new value ¶

This query must return a different value every time it is used (by any thread/client).

Can probably be a stored procedure.

 DO GET_LOCK('x.OpSeq',10); -- check result
 UPDATE OpSequence SET seqNumber = seqNumber+1; 
 SELECT seqNumber FROM OpSequence;  
 DO RELEASE_LOCK('x.OpSeq');

There is a variation of this that can be used if an error should not cause a number to be consumed