asp.net - 锁定事务 (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)唯一一次将事物写入数据库。
这里有没有人暗示这些锁定事务是如何产生的?
解决方案
根本问题是 UPDATE 语句中引用的表在 SELECT 语句期间被锁定。
答案就在你的问题中:
SELECT 正在同一个事务中运行
X
锁始终保持到 结束transaction
,即直到它提交或回滚。因此,如果在您的快速操作之后update
有很长的时间select
,那么所有update
锁定在您桌子上的东西都会保持锁定状态,直到您select
结束。
您可以分开您的update
,select
如果您的业务规则允许,您可以在更新的表上添加适当index
的以仅锁定某些行而不是整个表,或者您可以优化您select
的执行速度更快。
推荐阅读
- grafana - 关于缺失系列/数据的警报
- android - 使android布局子比父更宽?
- javascript - 使用 java 脚本创建一个文本文件
- java - 将 ADB 命令转换为 Java
- css - 我可以通过在线前缀推送我所有的 CSS 吗?
- chart.js - Chart.js - 作为数组数组的数据输入
- wordpress - WordPress 帖子/页面仅在用户使用外部 API 进行身份验证时显示
- android - join() 方法不等待线程结束
- c++ - 无复制构造函数的简单编译时间检查
- typescript - Visual Studio Code 和 TSLint:代码换行到 80 多个字符