Ich glaube nicht, dass es möglich ist, dies deklarativ zu tun.
Wenn garantiert ist, dass alle Einfügungen die gespeicherte Prozedur durchlaufen und der SaleValue nach dem Einfügen nicht aktualisiert wird, sollte Folgendes funktionieren (ich habe Tabellen- und Spaltennamen erfunden, da diese in der ursprünglichen Frage nicht angegeben wurden)
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
Der HOLDLOCK
gibt serialisierbare Semantik und sperrt den gesamten Bereich, der der TransactionId
entspricht und den UPDLOCK
verhindert, dass zwei gleichzeitige Transaktionen denselben Bereich sperren, wodurch das Risiko von Deadlocks verringert wird.
Ein Index für TransactionId,SaleValue
wäre es am besten, diese Abfrage zu unterstützen.