Bagaimana cara membatalkan permintaan kunci aplikasi di SQL Server?

25

The sp_getapplock prosedur yang tersimpan memiliki kembali nilai-nilai berikut:

0: Kunci berhasil diberikan secara sinkron.
1: Kunci berhasil diberikan setelah menunggu kunci lain yang tidak kompatibel dilepaskan.
-1: Permintaan kunci habis.
-2: Permintaan kunci dibatalkan.
-3: Permintaan kunci dipilih sebagai korban kebuntuan.
-999: Menunjukkan validasi parameter atau kesalahan panggilan lainnya.

Saya menulis pembungkus untuk memanggil sp_getapplocklapisan akses data kami dan saya ingin tahu dalam keadaan apa -2 dapat dikembalikan sehingga saya bisa melempar pengecualian deskriptif dan bermanfaat. Jelas apa yang mengembalikan nilai -1 dan -3 dan saya dapat dengan mudah membuat kondisi pengujian yang menyebabkan nilai tersebut dikembalikan. Bagaimana saya mengatur untuk mendapatkan nilai kembali -2?

Heinzi
sumber

Jawaban:

5

Melihat sumber sp_getapplockproc pembungkus, semua nilai kembali kecuali untuk -999 berasal dari sys.xp_userlock prosedur tersimpan internal yang mendasarinya . Saya berani bertaruh proc internal mengembalikan -2 ketika permintaan dibatalkan oleh acara perhatian (batas waktu permintaan klien atau menjelaskan permintaan klien dibatalkan). Namun, tidak ada sp_getapplockkode lebih lanjut yang dieksekusi setelah batch dibatalkan, termasuk RETURNpernyataan. Akibatnya, kode pengembalian -2 dapat dikembalikan secara internal tetapi tidak ada cara praktis bagi klien untuk mendapatkan nilai.

Dengan asumsi teori ini benar, tidak ada nilai dalam menerjemahkan ke -2 ke pesan yang lebih deskriptif karena klien yang membatalkan permintaan di tempat pertama.

Saya akan menyerahkannya kepada Paul untuk mengonfirmasi ini dengan melangkah melalui kode mesin database SQL dengan debugger :-)

Dan Guzman
sumber
1

sp_getapplock membuat kunci pada semaphores, bukan objek fisik (per MSDN). Itu hanya akan memblokir proses lain jika itu adalah sp_getapplock dengan string yang sama dan mode kunci yang tidak kompatibel.

Jadi permintaan kunci akan dibatalkan dalam keadaan seperti: pengguna dengan hak istimewa lebih tinggi membatalkan kunci, proses server membatalkan kunci, pengguna yang menjalankan prosedur tersimpan atau administrator membunuh proses kunci. Deskripsi Anda mungkin "kunci dibatalkan oleh sistem atau pengguna lain." Saya tidak yakin bagaimana Anda akan menentukan proses / pengguna aktual yang membatalkan kunci.

Ben Schmeltzer
sumber
-1

Ada prosedur tersimpan aplikasi Release terkait yang sesuai yang disebut sp_releaseapplock.

Saya menulis sebuah artikel yang membingungkan berjudul "Mutexes in SQL" di sini di SQL Server Central tentang menggunakan prosedur yang tersimpan ini untuk mengontrol aliran aplikasi.

Toby
sumber
4
Sepertinya Anda menjawab pertanyaan dalam judul tetapi pertanyaan sebenarnya adalah "Dalam keadaan apa sp_getapplock kembali -2?"
Martin Smith
Permintaan kunci dibatalkan. Memang, itu aneh. Bagaimana proses membatalkan permintaannya sendiri untuk kunci tanpa mengetahui bahwa itu telah dibatalkan! Anda mungkin harus menerima bahwa Anda tidak dapat memberikan kesalahan yang berarti selain dari satu yang disediakan MS - "Permintaan kunci dibatalkan".
Toby