如何正确处理DbContext以便不锁定表/整个db?

时间:2017-02-19 19:21:50

标签: c# sql-server entity-framework

我目前正在尝试使用EF完成批量插入/更新,因为我需要将大量数据传入保存到Db中。在每1000个插入或更新命令中,我处理上下文以便保持它跟踪的实体数量低。

我通过在SaveChanges()之后调用我的工作单元的dispose方法来实现这一点:

public void Dispose()
{
    context.Dispose();
    context = null;
}

然后实例化一个新的上下文并将其提供给从那时开始使用的工作单元。

prcess每隔60秒重复一次,到目前为止似乎工作正常,但我不时会看到SQL服务器卡在60秒之间。在插入之前使用获取当前在db中的所有数据的查询,以便找出我是否只需要更新某些实体。 (因此我只更新我已经在DB中拥有的实体)

var _allMatchDbEntries = matchRepository.GetAll()
                                .Include(x => x.Bets)
                                        .ToList();

此EF Select语句会挂起30-40秒(直到我猜测锁被删除),然后在1秒内触发并完成。 (我在管理工作室中单独测试了查询,但它根本没有减速)

我不知道为什么会出现这种延迟/锁定。除了调用Context.Dispose()以帮助SQL服务器解除之外,有人能告诉我是否需要做任何其他事情吗?或者是调用SaveChanges()的标准行为?

P.S。虽然这个使用连接的选择查询是挂起的,但是像match * from matches table和select * from bets table这样的简单查询在MangementStudio中运行得很好。

0 个答案:

没有答案