繁体   English   中英

SQL Server中的并发问题

[英]Concurrent issues in SQL Server

我有一组验证来确定要使用有效状态代码将记录插入数据库中,我们面临的问题是,许多用户在同一时间发出请求,而另一笔交易同时发生在另一笔交易的中间,并且都插入了有效的代码。状态,这是不应该的。 它应该返回一个错误,表明记录已经存在,可以通过简单的查询轻松地处理它,但是在特定的情况下,我们允许他们插入重复项,我尝试了sp_getapplock ,它虽然可以解决我的问题,但是却在很大程度上损害了性能。 是否有处理并发请求的最佳方法?

谢谢。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM