我的营业时间在我们的营业时间内运行。该过程偶尔会在删除语句上失败。删除语句是通过实体框架执行的(我不知道这是否重要)并且还会发生级联删除。
我们得到的错误如下:超时已到期。
操作完成前经过的超时时间 或服务器没有响应。声明已经终止。
我正在试图找出导致这种情况的原因。我发现我们有另一个进程在同一时间运行,它从正在发生删除的相同文件的视图中选择数据。可以读一下这个视图“阻止”删除吗?
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个“段”。
答案 0 :(得分:2)
是的,读取可以阻止删除。
但是,它也可能是引起此问题的级联删除。
我们遇到了完全相同的问题,事实证明问题不在于我们从表中删除的表(表A),而是具有外键引用的表(表B)。
在表B中,我们没有关于作为表A的外键的字段的索引。因此,对于从表A中删除的每个记录,必须顺序扫描表B以查找外键约束。当我们尝试一次删除表A中的大约1000条记录时,查询会超时。
一旦我们在表B中的字段中添加了索引,表A上的DELETE就会从10分钟变为即时运行。