繁体   English   中英

如何解决“等待操作超时”

[英]How to get round 'The wait operation timed out'

我正在用 c 构建电子商务系统。 10000 种产品,每个有 15 个品种,每个都有独特的价格来匹配,所以 c. 150,000 产品价格。 价格每天都在变化,这些以 CSV 格式发送给我们,我们会自动导入以重写新价格的整个数据库表,因为每天 95% 以上的价格都会发生变化。 由于这个数字,我们对每个价格都有一个标志,表明该价格是否是网站上可见的价格。

在我们导入后,昨天在网站上的价格(因此被标记为可见),以及新的和不在网站上的价格在 C# 控制台行程序中切换了他们的标志,使用这个 LINQ 命令:-

db.Database.ExecuteSqlCommand("UPDATE [MyDatabase].[dbo].[ProductVariationPrice] SET IsVisible = IsVisible ^ 1");

所以标记为 IsVisible 的所有内容现在都不可见,反之亦然。 即使对于 300,000 行,这也需要不到一秒钟的时间,然后我们删除设置为 IsVisible = 1 的行范围。

在此之前我们使用 BulkInsert 快速插入行,并使用 LINQ 的RemoveRange删除要删除的不可见项。

最初这很好,但我现在让电子商务网站上的用户在数据标志切换和旧数据被删除的确切时间段收到“等待操作超时”错误。

在此期间如何停止此等待操作超时? 我被告知我们不能做的事情:-

  • 更新每条记录而不是重写整个表(花费太长时间)
  • 当新价格出现时,将所有人锁定在系统之外一段时间。

有人可以建议吗? 这是保持数据库连接打开更长时间的情况吗?

提前致谢!

更新以下是瓶颈的完整代码:-

using (TransactionScope transaction = new TransactionScope())
{
    db.Database.ExecuteSqlCommand("UPDATE [MyDatabase].[dbo].[ProductVariationPrice] SET IsVisible = IsVisible ^ 1");
    transaction.Complete();
}

List<ProductVariationPrice> oldProductPrices = db.ProductVariationPrices.Where(x => !x.IsVisible).ToList();
db.ProductVariationPrices.RemoveRange(oldProductPrices);
db.SaveChanges();

改变你的方法。 您不需要删除记录然后再次插入它们。 插入操作的成本并不比更新低(实际上取决于多种因素)。 并且已经被禁止的从 C# 代码更新记录的想法很糟糕。 相反,这样做:

Import the CSV file to additional, working table in the database.

不要忘记添加主键。 如果您不需要更新的事务日志,请使用 TRUNCATE,或者只需 DROP 并重新创建工作表。 这将比从中删除行快得多。 还可以考虑使用 TEMPORARY 表。

Write a query to update the records in the original table by joining the records in the working/TEMPORARY table you just imported.

就是这样。

当然,您可以根据自己的情况使用IsVisible标志,但我认为不再需要它了。

暂无
暂无

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

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