Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server - Inserções simultâneas na tabela de vários clientes - Verificar Limite e Bloquear


Eu não acho que é possível fazer isso declarativamente.

Se todas as inserções forem garantidas para passar pelo procedimento armazenado e o SaleValue não for atualizado uma vez inserido, o seguinte deve funcionar (criei nomes de tabelas e colunas, pois não foram fornecidos na pergunta inicial)
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

O HOLDLOCK fornece semântica serializável e bloqueia todo o intervalo correspondente ao TransactionId e o UPDLOCK impede que duas transações simultâneas bloqueiem o mesmo intervalo, reduzindo assim o risco de deadlocks.

Um índice em TransactionId,SaleValue seria melhor para apoiar esta consulta.