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

sam*_*mmy 5 sql sql-server unlock sql-server-2008 sql-server-2008-r2

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

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

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

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

谢谢!

Mar*_*ith 5

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

如果所有插入都保证通过存储过程并且一旦插入就不更新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
Run Code Online (Sandbox Code Playgroud)

所述HOLDLOCK给序列化的语义和锁定的整个范围相匹配的TransactionIdUPDLOCK锁定在相同范围从而减少死锁的危险防止两个并发事务.

索引TransactionId,SaleValue最适合支持此查询.