Làm cách nào để tôi hủy yêu cầu khóa ứng dụng trong SQL Server?


25

Quy trình được lưu trữ sp_getapplock có các giá trị trả về sau:

0: Khóa được cấp thành công đồng bộ.
1: Khóa được cấp thành công sau khi chờ các khóa không tương thích khác được phát hành.
-1: Yêu cầu khóa đã hết thời gian.
-2: Yêu cầu khóa đã bị hủy.
-3: Yêu cầu khóa được chọn là nạn nhân bế tắc.
-999: Biểu thị xác thực tham số hoặc lỗi cuộc gọi khác.

Tôi đang viết một trình bao bọc để gọi sp_getapplocktrong lớp truy cập dữ liệu của chúng tôi và tôi muốn biết trong trường hợp nào -2 có thể được trả về để tôi có thể đưa ra một ngoại lệ mô tả và hữu ích. Rõ ràng giá trị trả về của -1 và -3 có nghĩa là gì và tôi có thể dễ dàng tạo các điều kiện kiểm tra khiến các giá trị đó được trả về. Làm thế nào tôi có thể quản lý để có được giá trị trả về -2?

Câu trả lời:


5

Nhìn vào nguồn của sp_getapplocktrình bao bọc, tất cả các giá trị trả về ngoại trừ -999 bắt nguồn từ sys.xp_userlock thủ tục được lưu trữ bên trong. Tôi đặt cược rằng Proc nội bộ trả về -2 khi yêu cầu bị hủy bởi một sự kiện chú ý (hết thời gian truy vấn của khách hàng hoặc hủy bỏ hủy truy vấn của khách hàng). Tuy nhiên, không có sp_getapplockmã nào được thực thi sau khi lô bị hủy, bao gồm cả RETURNcâu lệnh. Do đó, mã trả về -2 có thể được trả về trong nội bộ nhưng không có cách nào thực tế để khách hàng nhận được giá trị.

Giả sử lý thuyết này là chính xác, sẽ không có bất kỳ giá trị nào trong việc chuyển từ -2 sang thông điệp mô tả nhiều hơn vì đó là ứng dụng khách đã hủy yêu cầu ở vị trí đầu tiên.

Tôi sẽ để nó cho Paul xác nhận điều này bằng cách chuyển qua mã công cụ cơ sở dữ liệu SQL bằng trình gỡ lỗi :-)


1

sp_getapplock tạo khóa trên semaphores, không phải đối tượng vật lý (theo MSDN). Nó sẽ chỉ chặn một tiến trình khác nếu đó là sp_getapplock với cùng một chuỗi và chế độ khóa không tương thích.

Vì vậy, các yêu cầu khóa sẽ bị hủy trong các trường hợp như: người dùng có đặc quyền cao hơn hủy khóa, quy trình máy chủ hủy khóa, người dùng chạy thủ tục được lưu trữ hoặc quản trị viên sẽ giết quá trình khóa. Mô tả của bạn có thể là "khóa bị hủy bởi hệ thống hoặc người dùng khác." Tôi không chắc chắn làm thế nào bạn sẽ xác định quá trình / người dùng thực tế đã hủy khóa.


-1

Có một thủ tục lưu trữ khóa ứng dụng Phát hành tương ứng được gọi là sp_releaseapplock.

Tôi đã viết một bài viết có tiêu đề khó hiểu "Mutexes in SQL" ở đây trên SQL Server Central về việc sử dụng các thủ tục được lưu trữ này để kiểm soát luồng ứng dụng.


4
Có vẻ như bạn đang trả lời câu hỏi trong tiêu đề nhưng câu hỏi thực tế là "Trong trường hợp nào sp_getapplock sẽ trả về -2?"
Martin Smith

Yêu cầu khóa bị hủy. Thật vậy, đó là một số lẻ. Làm thế nào quá trình sẽ hủy yêu cầu riêng của mình cho một khóa mà không biết rằng nó đã bị hủy! Bạn có thể phải chấp nhận rằng bạn không thể đưa ra một lỗi có ý nghĩa khác với lỗi mà MS cung cấp - "Yêu cầu khóa đã bị hủy".
Toby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.