锁定交易(SQL Server + EF5)

时间:2019-02-06 10:30:06

标签: asp.net sql-server entity-framework entity-framework-5 .net-4.5

我正在尝试使用.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)唯一将内容写入数据库的时间。

这里有没有人暗示如何生成这些锁定交易?

1 个答案:

答案 0 :(得分:0)

  

基本问题是UPDATE中引用的表   语句在SELECT语句期间被锁定。

答案在您的问题中

  

SELECT在同一事务中运行

X锁始终保持到transaction的结尾,即直到其提交或回滚为止。因此,如果在快速update之后有很长的select,则锁定在表中的所有update都将保持锁定状态,直到您的select结束为止。

如果业务规则允许,可以将updateselect分开,可以在更新的表上添加适当的index以仅锁定某些行而不锁定整个表,或者您可以优化select使其执行得更快。