Saya sarankan Anda pergi ke Menggunakan tabel sebagai Antrian. Antrian yang diterapkan dengan benar dapat menangani ribuan pengguna dan layanan secara bersamaan setinggi 1/2 Juta operasi enqueue/dequeue per menit. Sampai SQL Server 2005 solusinya rumit dan melibatkan pencampuran SELECT
dan UPDATE
dalam satu transaksi dan berikan campuran yang tepat dari petunjuk kunci, seperti dalam artikel yang ditautkan oleh gbn. Untungnya sejak SQL Server 2005 dengan munculnya klausa OUTPUT, solusi yang jauh lebih elegan tersedia, dan sekarang MSDN merekomendasikan penggunaan klausa OUTPUT:
Anda dapat menggunakan OUTPUT dalam aplikasi yang menggunakan tabel sebagai antrian, atau untuk menyimpan kumpulan hasil menengah. Artinya, aplikasi terus menambahkan atau menghapus baris dari tabel
Pada dasarnya ada 3 bagian teka-teki yang harus Anda selesaikan dengan benar agar dapat bekerja secara bersamaan:
- Anda perlu melakukan dequeue secara otomatis. Anda harus menemukan baris, melewati setiap baris yang terkunci, dan menandainya sebagai 'dequeued' dalam satu operasi atom, dan di sinilah
OUTPUT
klausa mulai berlaku:
with CTE as (
SELECT TOP(1) COMMAND, PROCESSED
FROM TABLE WITH (READPAST)
WHERE PROCESSED = 0)
UPDATE CTE
SET PROCESSED = 1
OUTPUT INSERTED.*;
- Anda harus susun tabel Anda dengan kunci indeks berkerumun paling kiri pada
PROCESSED
kolom. JikaID
digunakan kunci utama, lalu pindahkan sebagai kolom kedua di kunci berkerumun. Perdebatan apakah akan menyimpan kunci non-cluster padaID
kolom terbuka, tapi saya sangat mendukung tidak memiliki indeks non-cluster sekunder di atas antrian:
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
- Anda tidak boleh menanyakan tabel ini dengan cara lain selain dengan Dequeue. Mencoba melakukan operasi Peek atau mencoba menggunakan tabel baik sebagai Antrian dan sebagai toko akan sangat mungkin menyebabkan kebuntuan dan akan memperlambat throughput secara dramatis.
Kombinasi dequeue atomik, petunjuk READPAST pada elemen pencarian untuk dequeue dan kunci paling kiri pada indeks berkerumun berdasarkan bit pemrosesan memastikan throughput yang sangat tinggi di bawah beban yang sangat bersamaan.