首页 > 解决方案 > 锁定事务 (SQL Server + EF5)

问题描述

我正在尝试使用 .NET 4.5、EF5(具有二级缓存和延迟加载导航属性)和 SQL Server 2014 调试 ASP.NET 应用程序中的性能问题。我们在 SQL Server 中遇到了许多等待锁。当我查看锁定事务时,它们包含一个非常快速的 UPDATE,然后是一个非常大的 SELECT。UPDATE 表面上是必要的,但我很困惑为什么 SELECT 在同一个事务中运行(以及为什么要选择任何东西)。根本问题是 UPDATE 语句中引用的表在 SELECT 语句期间被锁定。

我们使用存储库模式从数据库中获取数据,并使用 DbContext.SaveChanges() 来提交更改。我无法弄清楚 EF 是如何产生一个同时存在写入和读取的事务的,并且当我尝试搜索 Google 时没有得到相关结果。

我们有许多进入系统的接口,以及一些在数据库上工作的控制台应用程序,但它们都经历了相同的 .NET 和 EF 设置/版本。

我认为它必须通过 SaveChanges,因为这是(AFAIK)唯一一次将事物写入数据库。

这里有没有人暗示这些锁定事务是如何产生的?

标签: asp.netsql-serverentity-frameworkentity-framework-5.net-4.5

解决方案


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

答案就在你的问题中:

SELECT 正在同一个事务中运行

X锁始终保持到 结束transaction,即直到它提交或回滚。因此,如果在您的快速操作之后update有很长的时间select,那么所有update锁定在您桌子上的东西都会保持锁定状态,直到您select结束。

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


推荐阅读