ฉันจะยกเลิกคำขอล็อคแอพใน SQL Server ได้อย่างไร


25

กระบวนการsp_getapplock ที่เก็บไว้มีค่าส่งคืนต่อไปนี้:

0: การล็อกได้รับการอนุญาตให้สำเร็จพร้อมกัน
1: อนุญาตให้ล็อกสำเร็จหลังจากรอการล็อกอื่นที่เข้ากันไม่ได้
-1: คำขอล็อกหมดเวลา
-2: คำขอล็อคถูกยกเลิก
-3: คำขอล็อคถูกเลือกให้เป็นเหยื่อการหยุดชะงัก
-999: ระบุการตรวจสอบความถูกต้องของพารามิเตอร์หรือข้อผิดพลาดการโทรอื่น ๆ

ฉันกำลังเขียน wrapper สำหรับการโทรsp_getapplockใน data access layer ของเราและฉันต้องการทราบว่าภายใต้สถานการณ์ใด -2 ซึ่งสามารถส่งคืนได้เพื่อที่ฉันจะสามารถโยนข้อยกเว้นเชิงอธิบายและเป็นประโยชน์ เห็นได้ชัดว่าค่าส่งคืนของ -1 และ -3 หมายถึงอะไรและฉันสามารถสร้างเงื่อนไขการทดสอบที่ทำให้ค่าเหล่านั้นถูกส่งคืนได้อย่างง่ายดาย ฉันจะจัดการเพื่อรับค่าตอบแทนเป็น -2 ได้อย่างไร

คำตอบ:


5

ดูที่แหล่งที่มาของsp_getapplockwrapper proc ค่าส่งคืนทั้งหมดยกเว้น -999 มาจากsys.xp_userlock โพรซีเดอร์ที่เก็บภายในภายใน ฉันจะเดิมพัน proc ภายในส่งกลับ -2 เมื่อคำขอถูกยกเลิกโดยเหตุการณ์ความสนใจ (หมดเวลาสอบถามลูกค้าหรืออธิบายยกเลิกแบบสอบถามลูกค้า) อย่างไรก็ตามยังไม่มีการเพิ่มเติมsp_getapplockรันรหัสหลังจากที่ชุดจะถูกยกเลิกรวมทั้งRETURNคำสั่ง ดังนั้นโค้ดส่งคืน -2 อาจถูกส่งคืนภายใน แต่ไม่มีวิธีปฏิบัติที่ลูกค้าจะได้รับค่า

สมมติว่าทฤษฎีนี้ถูกต้องไม่มีค่าใด ๆ ในการแปลเป็นข้อความอธิบายเพิ่มเติมที่ -2 เนื่องจากเป็นไคลเอนต์ที่ยกเลิกการร้องขอตั้งแต่แรก

ฉันจะทิ้งไว้ที่ Paul เพื่อยืนยันสิ่งนี้โดยใช้รหัสโปรแกรมฐานข้อมูล SQL พร้อมดีบักเกอร์ :-)


1

sp_getapplock สร้างการล็อกบน semaphores ไม่ใช่วัตถุทางกายภาพ (ต่อ MSDN) มันจะบล็อกกระบวนการอื่นเท่านั้นหากเป็น sp_getapplock ด้วยสตริงเดียวกันและโหมดล็อคที่เข้ากันไม่ได้

ดังนั้นการร้องขอการล็อกจะถูกยกเลิกภายใต้สถานการณ์เช่น: ผู้ใช้ที่มีสิทธิ์สูงกว่าจะยกเลิกการล็อคกระบวนการเซิร์ฟเวอร์ยกเลิกการล็อกผู้ใช้ที่รันโพรซีเดอร์ที่เก็บไว้หรือผู้ดูแลระบบฆ่ากระบวนการล็อก คำอธิบายของคุณอาจเป็น "ล็อคถูกยกเลิกโดยระบบหรือผู้ใช้รายอื่น" ฉันไม่แน่ใจว่าคุณจะกำหนดกระบวนการ / ผู้ใช้จริงที่ยกเลิกการล็อกได้อย่างไร


-1

มีการล็อคแอปพลิเคชัน Release ที่เกี่ยวข้องกันซึ่งเรียกว่า sp_releaseapplock

ฉันเขียนบทความชื่อ "Mutexes ใน SQL" อย่างสับสนที่นี่ใน SQL Server Central เกี่ยวกับการใช้ขั้นตอนที่เก็บไว้เหล่านี้เพื่อควบคุมโฟลว์แอปพลิเคชัน


4
ดูเหมือนว่าคุณกำลังตอบคำถามในชื่อเรื่อง แต่คำถามจริงคือ "ภายใต้สถานการณ์ใด sp_getapplock จะส่งกลับ -2"
Martin Smith

คำขอล็อคถูกยกเลิก อันที่จริงมันแปลก กระบวนการจะยกเลิกคำขอของตัวเองสำหรับล็อคโดยไม่ทราบว่าได้ถูกยกเลิกแล้ว! คุณอาจต้องยอมรับว่าคุณไม่สามารถให้ข้อผิดพลาดที่มีความหมายนอกเหนือจากที่ MS ให้ - "คำขอล็อคถูกยกเลิก"
Toby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.