我认为声明式地执行此操作是不可能的。
如果保证所有插入都将通过存储过程,并且一旦插入后就不会更新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
锁定在相同范围从而减少死锁的危险防止两个并发事务。