服务调用数据库,在加载

时间:2016-06-21 15:06:52

标签: c# sql-server database web-services

我正在使用C#Web API Web服务来调用SQL Server 2008 R2数据库。在那里,它从表中获取一个ID(一个int),然后将该ID标记为“used”(该表有4列 - 一个主键,唯一的id,一个用于/未使用的位(0或1)以及唯一ID标记为“已使用”的日期。然后,ID会被传输到位于HTML标记中的网站。

现在,代码首先获取ID,然后将ID标记为已使用。在负载下(从20次连续命中开始),这些连续的数据库命中在字段被标记为“已使用”之前获取ID。这意味着负载同时抓取多个ID。因此,当每次点击都会产生一个不会再次出现的唯一ID时,我们会在结果中看到重复的ID。我首先考虑减轻这种情况只是为了扭转操作的顺序 - 将ID标记为先使用,这可能不会消除问题,但可能会减少它。

所以一般的问题是其他人如何处理重载下的数据库命中?数据库命中由主页访问触发,因此重叠的可能性很高(尽管网站甚至没有接近我们的负载测试正在运行的流量)。我也不想发起任何阻止,因为如果ID没有生成,网站仍然可以运行。

基本上,我希望减轻服务在加载时抓取多个数据库记录。我打算研究数据库锁定方法,但我不确定这是否会有所帮助。其他想法?

我没有发布实际代码,因为这感觉更概念,但如果发布代码有帮助,请告诉我。

1 个答案:

答案 0 :(得分:1)

我猜你的过程是这样的:

  1. Web API点击
  2. Web API为ID
  3. 运行SELECT语句
  4. Web API运行UPDATE语句以增加ID
  5. 发回客户
  6. 正在发生的事情是,在负载下,第二个用户进入第2步和第2步之间。 3。

    您需要在单个交易中选择并更新该ID。您可以通过以下两种方式之一完成此操作;

    1. 将其包装在事务中,最好是在存储过程中。该SP将begin一个事务,选择ID,增加它,然后commit该事务并将ID返回给调用者。

    2. 使用OUTPUT clause in a single UPDATE statement更新&返回新值。例如:

    3. update SEQUENCETABLE set LASTUSED = lastused+1 output inserted.LASTUSED where SEQUENCE_ID= 'SEQUENCENAME';