我正在尝试调试使用.NET 4.5、EF5 (具有二级缓存和延迟加载的导航属性)和SQL Server2014的ASP.NET应用程序中的性能问题。我们在SQL服务器中遇到了许多等待锁。当我查看锁定事务时,它们包含一个非常快速的更新,然后是一个非常大的SELECT。从表面上看,更新是必要的,但我搞不懂为什么SELECT在同一个事务中运行(以及为什么选择任何东西)。基本问题是UPDATE语句中引用的表在SELECT语句期间被锁定。
我们使用存储库模式从数据库获取数据,并使用DbContext.SaveChanges()提交更改。我不明白EF是如何产生一个同时有写和读的事务的,当我尝试搜索Google时,我没有得到相关的结果。
我们有许多进入系统的接口,还有几个在数据库上工作的控制台应用程序,但它们都通过相同的设置/版本的.NET和EF。
我认为它必须通过SaveChanges,因为这是(AFAIK)向数据库写入数据的唯一时间。
在座的任何人都有关于如何产生这些锁定事务的提示吗?
发布于 2019-02-06 18:43:01
基本问题是UPDATE语句中引用的表在SELECT语句期间被锁定。
答案就在你的问题里:
正在同一事务中运行SELECT
X锁始终保持到transaction的末尾,即直到它提交或回滚。因此,如果在快速update之后有一个长select,那么锁定在表中的所有update将保持锁定状态,直到select结束。
如果您的业务规则允许,您可以将update和select分开,您可以在更新表上添加适当的index以仅锁定某些行而不是整个表,或者您可以优化您的select以加快执行速度。
https://stackoverflow.com/questions/54551415
复制相似问题