Skip to content

Instantly share code, notes, and snippets.

@mwwhited
Last active April 8, 2021 17:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mwwhited/6dd9762aee0b79b3abadf58436258a57 to your computer and use it in GitHub Desktop.
Save mwwhited/6dd9762aee0b79b3abadf58436258a57 to your computer and use it in GitHub Desktop.
SQL Table as Queue

Simple TSQL Table as Queue

Show unlocked events

SELECT
	*
FROM dbo.queue WITH (READPAST)
;

Show all events

SELECT
	*
FROM dbo.queue WITH (READUNCOMMITTED)
;

Get, Lock, Process and Unlock Queue

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRAN

-- https://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/ 
DECLARE @workId INT = (
	SELECT TOP 1 [Id] 
	FROM dbo.queue
		WITH (UPDLOCK, READPAST)
);

DROP TABLE IF EXISTS [#processing];

SELECT TOP 1
	*
INTO [#processing]
FROM dbo.queue WITH (ROWLOCK, XLOCK, HOLDLOCK)
WHERE 
	[Id] = @workId; 
;

PRINT @workId;	

UPDATE dbo.queue
SET LastLock = GETDATE(), Status = 'Running'
WHERE 
	[Id] = @workId;

WAITFOR DELAY '00:00:30'; -- Do Work!
	
UPDATE dbo.queue
SET LastRelease = GETDATE(), Status = 'Done'
WHERE 
	[Id] = @workId;

COMMIT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment