sql >> Database >  >> RDS >> Sqlserver

Wederzijdse exclusieve toegang tot TSQL in een opgeslagen procedure

SERIALIZABLE is een isolatieniveau voor vergrendeling, geen semafoor .

Het zal in dit geval niet werken. Het enige wat u hoeft te doen is een leesvergrendeling aanhouden tot het einde van de TXN die een ander proces in het lezen van de code niet verhindert.

U moet sp_getapplock gebruiken in transactiemodus. U kunt het configureren om te wachten, onmiddellijk te bombarderen, enz.:aan u

Dit is gebaseerd op mijn sjabloon van Geneste opgeslagen procedures met TRY CATCH ROLLBACK-patroon?

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. String-opmaak met LISTAGG in Oracle. Enkele aanhalingstekens ontsnappen ` ' `

  2. verwijder informatie uit de mysql-tabel wanneer de gebruiker zijn browser sluit

  3. Gebruikersnaam weergeven op indexpagina

  4. Mysql utf32_unicode_ci en html charset utf-8 gebruikt, maar teken � verschijnt