由于数据库块导致的实体框架超时错误

时间:2012-12-07 17:56:32

标签: c# entity-framework sql-server-2005

有一个使用实体框架的项目(v1与.NET 3.5)。它已经使用了几年,但它现在被更多人使用。开始出现超时错误并将其跟踪到一些事情。为简单起见,我们假设我的数据库有三个表,product,part和product_part。有大约1400个零件和少数产品。

用户可以向产品添加任意数量的零件。我的问题是,当产品中添加了许多零件时,刀片需要很长时间。我认为这主要是由于网络流量/延迟,但插入所有1400需要大约一分钟。如果有人进入并尝试在插入这些记录时查看部件的详细信息,则会出现超时,并且可以在SQL Server的活动监视器中看到一个块。

我该怎么做才能避免这种情况?如果以前曾经问过我,我很抱歉,我错过了。

谢谢,
尼克

1 个答案:

答案 0 :(得分:1)

我认为根本问题是您的写入事务需要很长时间。 EF不擅长执行大规模DML。它在单独的网络往返和单独的语句中执行每个插入。

如果要插入1400行,并且性能很重要,请使用TVP(INSERT ... SELECT * FROM @tvp)在一个语句中插入。或者切换到批量复制,但我不认为只有1400行才有利。

如果您的读取事务被阻止,并且这是一个问题,请启用快照隔离。这样可以100%地处理读者,因为他们永远不会在快照隔离下阻止。