SQL Server – 从多个客户端同时插入表 – 检查限制和阻止

我们最近面临一个问题,即从多个客户端同时插入我们的一个sal服务器表.我希望你们能帮助我们.

我们使用存储过程来执行事务.在该存储过程中,对于每笔交易,我们计算到目前为止的总销售额.如果总销售额低于设定限额,
那么交易将被允许.否则,交易将被拒绝.

它大部分时间都很好用.但是,有时当多个客户端同时尝试完成交易时,限制检查失败,因为两个事务都完成了.

你们能否建议我们如何有效地实施限制?有没有更好的方法呢?

谢谢!

最佳答案
我认为不可能以声明的方式做到这一点.

如果所有插入都保证通过存储过程并且一旦插入就不更新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防止两个并发事务锁定相同的范围,从而降低死锁的风险.

TransactionId,SaleValue上的索引最好支持此查询.

转载注明原文:SQL Server – 从多个客户端同时插入表 – 检查限制和阻止 - 代码日志