Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Akses eksklusif bersama TSQL dalam prosedur tersimpan

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi split setara dalam T-SQL?

  2. Ekspor hasil kueri SQL Server 2005 ke pernyataan SQL INSERT?

  3. Cara mengatur parameter SQL tanpa nama di SqlCommand

  4. Gunakan FILE_IDEX() untuk Mengembalikan ID File Database di SQL Server

  5. Arti Kunci Utama untuk Microsoft SQL Server 2008