SQL Server中的并发问题

时间:2018-09-25 07:58:50

标签: sql sql-server concurrency

我有一组验证,这些验证决定要使用有效状态代码将记录插入数据库中,我们面临的问题是,许多用户正在同时发出请求,并且在一个事务的中间又有另一个事务到来,而两者都在插入了有效状态,不应该这样。它应该返回一个错误,表明记录已经存在,可以通过简单的查询轻松地处理它,但是在特定情况下,我们允许他们插入重复项,我已经尝试过 sp_getapplock ,它可以解决我的问题,但是却有损表演大时间。有什么最佳方法可以处理并发请求?

谢谢。

1 个答案:

答案 0 :(得分:4)

sp_getapplock几乎是您可以采取的最佳锁定和最任意锁定。其功能更像OOO编程中的lock关键字。基本上,您为资源命名,给它一个范围(proc或事务),然后锁定它。几乎没有什么可以绕过那个锁,这就是为什么它可以解决您的比赛条件。对于您想做的事情,这可能也太疯狂了。

想到的第一个代码/体系结构想法是重组该表。我将假设您的更新量很高,否则您将不会遇到这些违规行为。您可以简单地使用try / catch块,并使catch块在PK违例时重试。笨拙,但也许可以解决问题。

接下来,您可以考虑更改全天接收此更新流的表的结构。使该表primary keyed脱离身份列,几乎什么也没有。插入物将闪电般快速,因此任何遮挡都可以忽略不计。然后,您可以将这些数据分批移动到更适合批处理的表中(而不是尝试实时批处理)

还有transaction isolation settings的整个范围,它们可以调整SQL的常规锁定系统以支持不同的变体(无论是在批处理级别还是通过查询提示进行内联。我会仔细阅读这些内容,但您可能会考虑查看序列化隔离。各种设置将强制执行不同的运行时规则,以满足您的需求。

还请务必检查您的交易。您可能想要将地狱锁定在该表之外(并且可能在其他操作期间),但是一旦这种需求消失了,锁定也应该锁定。