1

我有CodeFirst网络应用程序MVC4+EF+SQLServer。有StatisticDateStamp(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表中的所有记录,但网络应用程序锁定了Statistic表。当我尝试在 SQL Server 中执行 SQL 时,它会冻结。

DELETE FROM Statistic

知道如何解决问题吗?

4

1 回答 1

2

它只是冻结

因此,您需要调查 SQL Server 中的阻塞。一个简单的工具是活动监视器。这有点过时但仍然有用:了解和解决 SQL Server 阻塞问题

您会发现 reads block writes 和 writes block reads,可能是因为您的隔离级别(请参阅using new TransactionScope() Considered Harmful)。

在生产中使用批量删除是非常有问题的,并且总是导致阻塞。一个更好的选择是TRUNCATE如果你真的想核对内容。DELETE 应该小批量使用,不仅可以防止彻底阻塞,而且您也不会由于容纳每一行删除所需的增长而导致大量日志中断。

知道如何解决问题吗?

查看数据库引擎中基于行版本控制的隔离级别。确保您不使用new TransactionScope().

于 2013-04-02T08:23:54.807 回答