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.