Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据库块导致实体框架超时错误_C#_Entity Framework_Sql Server 2005 - Fatal编程技术网

C# 数据库块导致实体框架超时错误

C# 数据库块导致实体框架超时错误,c#,entity-framework,sql-server-2005,C#,Entity Framework,Sql Server 2005,拥有一个使用实体框架(v1和.NET3.5)的项目。它已经使用了几年,但现在被更多的人使用。开始出现超时错误,并对其进行了跟踪。为了简单起见,假设我的数据库有三个表:product、part和product\u part。大约有1400个零件和少量产品 用户可以向产品添加任意数量的零件。我的问题是,当产品中添加了许多零件时,插入件需要很长时间。我认为这主要是由于网络流量/延迟造成的,但插入所有数据大约需要一分钟。如果有人在插入记录时进入并试图查看零件的详细信息,我会得到一个超时,并且可以在SQL

拥有一个使用实体框架(v1和.NET3.5)的项目。它已经使用了几年,但现在被更多的人使用。开始出现超时错误,并对其进行了跟踪。为了简单起见,假设我的数据库有三个表:product、part和product\u part。大约有1400个零件和少量产品

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

我能做些什么来避免这种情况?如果以前有人问过我,我很抱歉,我错过了

谢谢,

尼克

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

如果要插入1400行,并且性能很重要,请使用TVP(
insert…SELECT*FROM@TVP
)在一条语句中插入。或者切换到批量复制,但我不认为只有1400行会有好处


如果您的读取事务被阻止,并且这是一个问题,请打开快照隔离。这将百分之百地保护读卡器,因为它们在快照隔离下从不阻塞。

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

如果要插入1400行,并且性能很重要,请使用TVP(
insert…SELECT*FROM@TVP
)在一条语句中插入。或者切换到批量复制,但我不认为只有1400行会有好处


如果您的读取事务被阻止,并且这是一个问题,请打开快照隔离。这100%地照顾了读卡器,因为它们在快照隔离下从不阻塞。

感谢您的帮助,我非常感谢。我没听说过TVP,但事实证明我不能使用它们,因为客户使用的是2005。他们明年将升级。我必须和他们的DBA谈谈关于启用快照隔离的问题,但现在我将采用批量插入的方式。这感觉有点像用大锤敲打一颗小钉子。我在用这个愚蠢的后续问题。如果在ManagementStudio中运行1400条insert语句,是否会锁定表?为什么不同?它不锁定表,而是锁定单个行。在这两种情况下!没有区别。SSMS是一个客户端,就像你的应用一样。谢谢。我问这个问题的原因是,我通过SSM发送了8000条insert语句,并且能够查看记录(在我的应用程序中),这与我通过我的应用程序发送大量insert时不同。由于每笔交易有8k条insert,您可能会遇到锁升级(我想触发时间为5k)。尝试使用(ROWLOCK)将
插入到插入项上,或禁用会话的锁升级。谢谢您的帮助,我非常感谢。我没听说过TVP,但事实证明我不能使用它们,因为客户使用的是2005。他们明年将升级。我必须和他们的DBA谈谈关于启用快照隔离的问题,但现在我将采用批量插入的方式。这感觉有点像用大锤敲打一颗小钉子。我在用这个愚蠢的后续问题。如果在ManagementStudio中运行1400条insert语句,是否会锁定表?为什么不同?它不锁定表,而是锁定单个行。在这两种情况下!没有区别。SSMS是一个客户端,就像你的应用一样。谢谢。我问这个问题的原因是,我通过SSM发送了8000条insert语句,并且能够查看记录(在我的应用程序中),这与我通过我的应用程序发送大量insert时不同。由于每笔交易有8k条insert,您可能会遇到锁升级(我想触发时间为5k)。尝试使用(ROWLOCK)
拍击到插入项上,或禁用会话的锁升级。