我正在尝试使用.NET 4.5,EF5(具有第二级缓存和延迟加载的导航属性)和SQL Server 2014调试ASP.NET应用程序中的性能问题。我们正在体验许多等待锁SQL服务器。当我查看锁定事务时,它们包含一个非常快的UPDATE,然后是一个非常大的SELECT。表面上看,UPDATE是必需的,但我对为什么在同一个事务中运行SELECT感到困惑(为什么选择了所有东西)。根本问题是,在SELECT语句的持续时间内,UPDATE语句中引用的表被锁定。
我们使用存储库模式从db获取数据,并使用DbContext.SaveChanges()提交更改。我无法弄清楚EF怎么可能会产生同时进行读写操作的交易,并且当我尝试搜索Google时没有得到相关的结果。
我们有许多与系统的接口,还有一些在数据库上运行的控制台应用程序,但是它们都通过.NET和EF的相同设置/版本进行操作。
我认为必须通过SaveChanges,因为这是(AFAIK)唯一将内容写入数据库的时间。
这里有没有人暗示如何生成这些锁定交易?
答案 0 :(得分:0)
基本问题是UPDATE中引用的表 语句在SELECT语句期间被锁定。
答案在您的问题中
SELECT在同一事务中运行
X
锁始终保持到transaction
的结尾,即直到其提交或回滚为止。因此,如果在快速update
之后有很长的select
,则锁定在表中的所有update
都将保持锁定状态,直到您的select
结束为止。
如果业务规则允许,可以将update
和select
分开,可以在更新的表上添加适当的index
以仅锁定某些行而不锁定整个表,或者您可以优化select
使其执行得更快。