Saya akan menggunakan bidang IDENTITY sebagai kunci utama untuk memberikan ID yang bertambah secara unik untuk setiap item yang antri, dan menempelkan indeks berkerumun di atasnya. Ini akan mewakili urutan item yang diantrekan.
Untuk menyimpan item dalam tabel antrian saat Anda memprosesnya, Anda memerlukan bidang "status" untuk menunjukkan status item tertentu saat ini (mis. 0=menunggu, 1=sedang diproses, 2=diproses). Ini diperlukan untuk mencegah item diproses dua kali.
Saat memproses item dalam antrean, Anda harus menemukan item berikutnya dalam tabel yang TIDAK sedang diproses. Ini harus sedemikian rupa untuk mencegah beberapa proses mengambil item yang sama untuk diproses pada waktu yang sama seperti yang ditunjukkan di bawah ini. Perhatikan petunjuk tabel UPDLOCK dan READPAST yang harus Anda perhatikan saat menerapkan antrian.
misalnya dalam sproc, seperti ini:
DECLARE @NextID INTEGER
BEGIN TRANSACTION
-- Find the next queued item that is waiting to be processed
SELECT TOP 1 @NextID = ID
FROM MyQueueTable WITH (UPDLOCK, READPAST)
WHERE StateField = 0
ORDER BY ID ASC
-- if we've found one, mark it as being processed
IF @NextId IS NOT NULL
UPDATE MyQueueTable SET Status = 1 WHERE ID = @NextId
COMMIT TRANSACTION
-- If we've got an item from the queue, return to whatever is going to process it
IF @NextId IS NOT NULL
SELECT * FROM MyQueueTable WHERE ID = @NextID
Jika pemrosesan item gagal, apakah Anda ingin dapat mencobanya lagi nanti? Jika demikian, Anda harus mengatur ulang status kembali ke 0 atau sesuatu. Itu akan membutuhkan lebih banyak pemikiran.
Atau, jangan gunakan tabel database sebagai antrian, tetapi sesuatu seperti MSMQ - saya pikir saya akan memasukkannya ke dalam campuran!