我试图调试使用.NET 4.5 ASP.NET应用程序性能问题,EF5(具有2级缓存和延迟加载导航性能)和SQL Server 2014,我们正在经历的SQL服务器的一些等待锁。当我看到在锁定交易,它们包含了非常快速的更新,然后一个非常大的选择。更新表面上是一个必要条件,但我很困惑,为什么选择在同一个事务中运行(为什么事情正在以全部选中)。最根本的问题是,在UPDATE语句引用的表被锁定SELECT语句的持续时间。
我们使用从DB获得数据)提交变更资料库模式,DbContext.SaveChanges(。我无法弄清楚它是如何可能,哪里有既写和读EF产生一个事务,我没有得到相关的搜索结果,当我试图搜索谷歌。
我们有很多的接口集成到系统,和一对夫妇的数据库上工作的控制台应用程序为好,但他们都经历过相同的设置的.NET和EF /版本。
我估计,它必须通过调用SaveChanges,因为这是(据我所知),事情都写入到数据库中唯一的一次。
是否有人在这里有一个提示,这些锁定交易可能如何产生的?
最根本的问题是,在UPDATE语句引用的表被锁定SELECT语句的持续时间。
答案就在你的问题:
在SELECT是在同一个事务中运行
X
锁总是保持直到transaction
的末端,即直到它提交或回滚。所以,如果你的快速update
后还有很长的select
,所有update
锁定在你的表保持锁定状态,直到你select
结束。
您可以分开你的update
和select
如果你的业务规则允许,你可以更新的表添加合适的index
只锁定某些行,而不是整个表,或者您可以优化select
执行得更快。