sam*_*mmy 5 sql sql-server unlock sql-server-2008 sql-server-2008-r2
我们最近面临一个问题,即从多个客户端同时插入我们的一个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
Run Code Online (Sandbox Code Playgroud)
所述HOLDLOCK给序列化的语义和锁定的整个范围相匹配的TransactionId和UPDLOCK锁定在相同范围从而减少死锁的危险防止两个并发事务.
索引TransactionId,SaleValue最适合支持此查询.
| 归档时间: |
|
| 查看次数: |
3962 次 |
| 最近记录: |