Apakah PK adalah kunci utama? Maka ini bukan masalah, jika Anda sudah tahu kunci utama tidak ada olahraga. Jika pk adalah kunci utama, maka ini menimbulkan pertanyaan yang jelas bagaimana apakah Anda tahu pk item yang akan didequeue...
Masalahnya adalah jika Anda tidak mengetahui kunci utama dan ingin menghapus 'tersedia' berikutnya (yaitu status =y) dan menandainya sebagai dequeued (hapus atau setel status =z).
Cara yang tepat untuk melakukan ini adalah dengan menggunakan satu pernyataan. Sayangnya sintaks berbeda antara Oracle dan SQL Server. Sintaks SQL Server adalah:
update top (1) [<table>]
set status = z
output DELETED.*
where status = y;
Saya tidak cukup akrab dengan klausa RETURNING Oracle untuk memberikan contoh yang mirip dengan OUTPUT SQL.
Solusi SQL Server lainnya memerlukan petunjuk kunci pada SELECT (dengan UPDLOCK) agar benar. Di Oracle, jalan yang dipilih adalah menggunakan FOR UPDATE, tetapi itu tidak berfungsi di SQL Server karena FOR UPDATE akan digunakan bersama dengan kursor di SQL .
Bagaimanapun, perilaku yang Anda miliki di pos asli tidak benar. Beberapa sesi semuanya dapat memilih baris yang sama dan bahkan semua memperbaruinya, mengembalikan item dequeued yang sama ke beberapa pembaca.