Ik denk niet dat het mogelijk is om dit declaratief te doen.
Als alle invoegingen gegarandeerd door de opgeslagen procedure gaan en de SaleValue niet wordt bijgewerkt nadat deze is ingevoegd, zou het volgende moeten werken (ik heb tabel- en kolomnamen verzonnen omdat deze niet in de oorspronkelijke vraag waren opgegeven)
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
De HOLDLOCK geeft serialiseerbare semantiek en vergrendelt het hele bereik dat overeenkomt met de TransactionId en de UPDLOCK voorkomt dat twee gelijktijdige transacties hetzelfde bereik blokkeren, waardoor het risico op impasses wordt verkleind.
Een index op TransactionId,SaleValue zou het beste zijn om deze vraag te ondersteunen.