我有一个过程,在我们的业务休息时间运行。进程偶尔会在delete语句上失败。delete语句是通过执行的(我不知道这是否重要),还有级联删除也会发生。
我们得到的错误如下:超时过期。
在操作完成或服务器没有响应之前经过的超时时间。声明已被终止。
我想找出是什么导致了这一切。我发现,我们有另一个进程在同一时间运行,该进程从视图中选择数据,其内容与发生删除的文件相同。读取此视图可以“阻止”删除吗?
public void DeletePolicySegments(IList<int> segmentIds)
{
using (Models.PolicyContainer context = new Models.PolicyContainer())
{
if (segmentIds != null && segmentIds.Count > 0)
{
foreach (var segmentId in segmentIds)
{
var x = context.PolicySegments.Where(t => t.SegmentId == segmentId).Single();
context.PolicySegments.DeleteObject(x);
}
context.SaveChanges();
}
}
}它应该只删除"DeletePolicySegments“的每个调用2-4个”段“。
发布于 2013-05-20 15:48:17
是的,读取可以阻止删除。
但是,造成这种情况的也可能是级联删除。
我们遇到了完全相同的问题,结果发现问题不是我们从表A中删除的表,而是具有外键引用的表(表B)。
在表B中,我们没有作为表A的外键的字段索引,因此对于从表A中删除的每一条记录,必须对表B进行顺序扫描,以查找外键约束。当我们尝试一次从表A中删除大约1000条记录时,查询就会超时。
一旦我们向表B中的字段添加了一个索引,表A上的删除就从10分钟到瞬间运行。
https://stackoverflow.com/questions/16653001
复制相似问题