Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server:inserimenti simultanei nella tabella da più client:controllo limite e blocco

Non credo sia possibile farlo in modo dichiarativo.

Se è garantito che tutti gli inserimenti passino attraverso la procedura memorizzata e SaleValue non viene aggiornato una volta inserito, allora dovrebbe funzionare quanto segue (ho creato nomi di tabelle e colonne poiché non sono stati forniti nella domanda iniziale)

DECLARE @SumSaleValue MONEY

BEGIN TRAN

SELECT @SumSaleValue = SUM(SaleValue)
FROM dbo.Orders WITH (UPDLOCK, HOLDLOCK)
WHERE TransactionId = @TransactionId

IF @SumSaleValue > 1000
    BEGIN
    RAISERROR('Cannot do insert as total would exceed order limit',16,1);
    ROLLBACK;
    RETURN;
    END

/*Code for INSERT goes here*/

COMMIT

Il HOLDLOCK fornisce una semantica serializzabile e blocca l'intero intervallo che corrisponde a TransactionId e il UPDLOCK impedisce che due transazioni simultanee blocchino lo stesso intervallo riducendo così il rischio di deadlock.

Un indice su TransactionId,SaleValue sarebbe meglio supportare questa query.