SERIALIZABLE adalah tingkat isolasi untuk penguncian, bukan semaphore .
Ini tidak akan berfungsi dalam hal ini yang akan Anda lakukan hanyalah mempertahankan kunci baca hingga akhir TXN yang tidak mencegah proses lain ke dalam pembacaan kode.
Anda perlu menggunakan sp_getapplock dalam mode Transaksi. Anda dapat mengonfigurasinya untuk menunggu, mengebom segera, dll:terserah Anda
Ini didasarkan pada template saya dari Prosedur tersimpan bersarang yang berisi pola 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