针对一个数据库表上的大量请求的最佳解决方案

时间:2012-03-28 03:00:45

标签: sql sql-server database

我们有一个系统,按先到先得的原则为客户分配产品。

我们的产品表包含一个从零开始的递增主键,用于跟踪已分配的产品数量,即用户保留产品并分配1,下一个用户获得2等。

问题是,在任何给定的时间内,可能有数十万用户访问系统。所有人都将在这一张桌子上打。

由于我们需要确保每个客户只分配一个产品并跟踪已分配的产品数量,我们对访问系统的每个客户使用行锁定,以确保他们在下一个客户点击之前写入表格系统 - 即执行先到先得的规则。

我们担心每个请求进入 SQL Server 2008 Enterprise Edition 的处理时间和行锁定的瓶颈。

我们不能使用多个服务器,因为我们需要确保primay密钥的完整性,因此任何需要复制的东西都无法正常工作。

有没有人知道在一个数据库表上处理大量请求时特别有效的任何好解决方案?

更多信息:
有问题的表基本上只包含两个字段--ID和CustomerID。解决方案是免费赠送一百万种产品 - 因此对高需求的期望以及为什么使用递增的主键作为关键对我们来说是有意义的 - 一旦密钥达到一百万,就没有更多的客户可以注册。而且,产品都是不同的,因此正确密钥的分配是重要的,例如,前100位客户收到的产品价值高于接下来的100位

1 个答案:

答案 0 :(得分:6)

首先,为了消除密钥生成的问题,我会提前生成它们。它只有1米行,这意味着您不必担心管理密钥生成过程。这也意味着您不必担心意外生成太多行,因为一旦填充了表,您将只执行UPDATE,而不是INSERT。

这里的一个重要问题是,所有1m项目是否相同?如果它们是,那么密钥的顺序无关紧要(或者即使它们有订单),因此当客户提交请求时,您只需“尝试”更新表格大致如下:

UPDATE TOP(1) dbo.Giveaway -- you can use OUTPUT to return the key value here
SET CustomerID = @CurrentCustomerID
WHERE CustomerID IS NULL

IF @@ROWCOUNT = 0 -- no free items left
PRINT 'Bad luck'
ELSE
PRINT 'Winner'

另一方面,如果1米的物品不同,那么您需要另一种解决方案,例如:项目1是X,项目2-10是Y,11-50是Z等。在这种情况下,按照提交请求的顺序为客户分配密钥很重要,所以你应该查看某种排队系统,也许使用Service Broker。每个客户都向队列添加一个请求,然后存储过程一次处理一个并为其分配MAX空闲密钥,然后返回他们赢得的详细信息。