Anda pada dasarnya menggambarkan alur kerja berbasis antrian klasik, dan Anda harus mempertimbangkan untuk menggunakan asli antrian .
Demi diskusi, inilah cara Anda mencapai apa yang Anda inginkan:
- klaim sumber daya tertentu:
SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK) WHERE key = @key
. Akan memblokir jika sumber daya sudah diklaim. Gunakan waktu tunggu kunci untuk mengembalikan pengecualian jika sumber daya sudah diklaim.key
harus diindeks dan unik. - sumber daya berikutnya yang tersedia:
SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK, READPAST) ORDER BY <accessorder>
. Anda harus menentukan urutan untuk mengekspresikan preferensi sumber daya (terlama, prioritas tertinggi, dll.) - melepaskan sumber daya yang diklaim:
COMMIT
transaksi Anda.
Inti masalahnya adalah menggunakan petunjuk kunci yang tepat, dan masalah semacam ini memang membutuhkan petunjuk kunci yang eksplisit untuk dipecahkan. UPDLOCK akan bertindak sebagai kunci 'klaim'. ROWLOCK menciptakan perincian yang tepat yang mencegah server 'mengoptimalkan' ke penguncian halaman. READPAST memungkinkan Anda untuk melewati sumber daya yang diklaim. Menempatkan UPDLOCK pada baris akan mengunci baris dan memungkinkan Anda untuk memperbaruinya nanti, tetapi akan mencegah operasi lain seperti SELECT read-commit biasa yang akan memblokir pada baris terkunci. Idenya adalah bahwa Anda tetap akan MEMPERBARUI baris, yang akan menempatkan kunci X yang tidak dapat dihindari. Jika Anda ingin membuat tabel lebih tersedia, Anda dapat menggunakan kunci aplikasi sebagai gantinya, tetapi secara signifikan lebih sulit untuk dilakukan dengan benar. Anda perlu meminta kunci aplikasi pada deskriptor string sumber daya, seperti nilai kunci, atau CHECKSUM
dari kunci atau %%LOCKRES%%
nilai. Kunci aplikasi memungkinkan Anda untuk memisahkan cakupan 'klaim' dari transaksi dengan meminta kunci aplikasi pada cakupan 'sesi', tetapi kemudian Anda harus melepaskan klaim secara manual (kunci aplikasi cakupan 'transaksi' dilepaskan pada waktu komit) . Perhatian, ada ribuan cara untuk menembak diri sendiri dengan kunci aplikasi.