我有CodeFirst
网络应用MVC4+EF+SQLServer
。 Statistic
列有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
知道如何解决问题吗?
答案 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()
。