EF阻止访问数据库表

时间:2013-04-02 08:13:13

标签: sql-server entity-framework

我有CodeFirst网络应用MVC4+EF+SQLServerStatistic列有DateStamp(DateTime)列。 Web应用程序在Statistic表中对每个请求执行计算(Where和Count)

public IQueryable<Statistic> GetStatisticForCurrentMonthByIp(string ip)
{
   return _context.Statistic.Where(p => p.Ip == ip && SqlFunctions.DateDiff("mm", DateTime.UtcNow, p.DateStamp) == 0);
} 

上面的方法在控制器

中调用了这个
var statList = _statisticService.GetStatisticForCurrentMonthByIp(queueItem.Ip).ToList();

问题是有时我需要删除Statistic表中的所有记录,但Web应用程序会锁定Statistic表。当我尝试在SQL Server中执行SQL时,它只是冻结。

DELETE FROM Statistic

知道如何解决问题吗?

1 个答案:

答案 0 :(得分:2)

  

它只是冻结

因此,您需要调查SQL Server中的阻止。一个简单的工具是Activity Monitor。这有点过时但仍然有用:Understanding and resolving SQL Server blocking problems

您会发现读取块写入和写入块读取,可能是因为您的隔离级别(请参阅using new TransactionScope() Considered Harmful)。

使用批量删除在生产中非常有问题,并且始终是堵塞的原因。如果你真的想要核实内容,那么更好的选择是TRUNCATE。 DELETE应该小批量使用,不仅可以防止彻底阻塞,而且由于需要增加每行删除,因此不会导致大量的日志中断。

  

知道如何解决问题吗?

查看Row Versioning-based Isolation Levels in the Database Engine。请确保您不使用new TransactionScope()