SERIALIZABLE là mức cách ly để khóa, không phải là semaphore .
Nó sẽ không hoạt động trong trường hợp này, tất cả những gì bạn sẽ làm là duy trì một khóa đọc ở cuối TXN mà không ngăn quá trình khác đọc mã.
Bạn cần sử dụng sp_getapplock trong chế độ Giao dịch. Bạn có thể cấu hình nó để đợi, đặt bom ngay lập tức, v.v.:tùy thuộc vào bạn
Điều này dựa trên mẫu của tôi từ Các thủ tục được lưu trữ lồng nhau có chứa mẫu TRY CATCH ROLLBACK?
ALTER PROCEDURE get_code
AS
SET XACT_ABORT, NOCOUNT ON
DECLARE @starttrancount int, @result int;
BEGIN TRY
SELECT @starttrancount = @@TRANCOUNT
IF @starttrancount = 0 BEGIN TRANSACTION
EXEC @result = sp_getapplock 'get_code', 'Exclusive', 'Transaction', 0
IF @result < 0
RAISERROR('INFO: One at a time please`!', 16, 1);
[...Perform work...]
IF @starttrancount = 0
COMMIT TRANSACTION
ELSE
EXEC sp_releaseapplock 'get_code';
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO