Cai*_*nai 6 sql database sql-server
我们有一个系统,客户按照先到先得的原则分配产品.
我们的产品表包含一个从零开始的递增主键,我们用它来跟踪已分配的产品数量,即用户保留产品并分配1,下一个用户获得2等.
问题是,在任何给定的时间内,可能有数十万用户访问系统.所有人都会打这一张桌子.
由于我们需要确保每个客户只分配一个产品并跟踪已分配的产品数量,我们对访问系统的每个客户使用行锁定,以确保他们在下一个客户到达系统之前写入表格 - 即执行先到先得的规则.
我们关注的是瓶颈,即每个请求进入SQL Server 2008 Enterprise Edition和行锁的处理时间.
我们不能使用多个服务器,因为我们需要确保primay密钥的完整性,因此任何需要复制的东西都不会起作用.
有没有人知道在一个数据库表上处理大量请求特别有效的任何好解决方案?
更多信息:
有问题的表基本上只包含两个字段--ID和CustomerID.解决方案是免费赠送一百万种产品 - 因此对高需求的期望以及为什么使用递增的主键作为关键对我们来说是有意义的 - 一旦密钥达到一百万,就没有更多的客户可以注册.此外,产品都是不同的,所以正确密钥的分配是重要的,例如,前100名客户输入接收比下一个100等更高价值的产品
首先,为了消除密钥生成的问题,我会提前生成它们.它只有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'
Run Code Online (Sandbox Code Playgroud)
另一方面,如果1m项目不同,那么您需要另一种解决方案,例如项目1是X,项目2-10是Y,11-50是Z等.在这种情况下,按照订单的顺序将客户分配给密钥是很重要的.请求已提交,因此您可能应该查看某种排队系统,可能使用Service Broker.每个客户向队列添加一个请求,然后存储过程一次处理一个并为其分配MAX空闲密钥,然后返回他们赢得的详细信息.