1

我有一个在我们的业务下班时间运行的流程。该过程有时会在删除语句上失败。删除语句是通过实体框架执行的(我不知道这是否重要),并且还会发生级联删除。

我们得到的错误如下: Timeout expired。

在操作完成之前超时时间已过或服务器没有响应。该语句已终止。

我试图找出可能导致这种情况的原因。我发现我们同时运行了另一个进程,该进程从视图中选择发生删除的相同文件的数据。可以阅读此视图“阻止”删除吗?

 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 个“段”。

4

1 回答 1

2

是的,读取可以阻止删除。

但是,也可能是导致这种情况的级联删除。

我们遇到了完全相同的问题,事实证明问题不在于我们要从中删除的表(表 A),而是具有外键引用的表(表 B)。

在表 B 中,我们没有对作为表 A 的外键的字段的索引。因此,对于从表 A 中删除的每条记录,必须按顺序扫描表 B 以查找外键约束。当我们尝试一次从表 A 中删除大约 1000 条记录时,查询会超时。

一旦我们为表 B 中的字段添加索引,表 A 上的 DELETE 从需要 10 分钟变为立即运行。

于 2013-05-20T15:48:17.137 回答