これを宣言的に行うことは不可能だと思います。
すべての挿入がストアド プロシージャを通過することが保証されており、SaleValue が挿入後に更新されない場合は、次のように動作するはずです (最初の質問で指定されていないテーブルと列の名前を作成しました)
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
プレ>
HOLDLOCK
シリアライズ可能なセマンティクスを提供し、TransactionId
に一致する範囲全体をロックします とUPDLOCK
2 つの同時トランザクションが同じ範囲をロックするのを防ぎ、デッドロックのリスクを軽減します。
TransactionId,SaleValue
のインデックス このクエリをサポートするのが最善でしょう。