Entity framework 所有select查询的EF Read UNCOMMIT

Entity framework 所有select查询的EF Read UNCOMMIT,entity-framework,tsql,transactions,locking,read-uncommitted,Entity Framework,Tsql,Transactions,Locking,Read Uncommitted,因为我的表记录上有很长时间的锁问题 在我的ASP.Net MVC web app和SQL Server数据库中,对Entity Framework 6的所有select查询使用“Read Uncommitted”事务隔离级别是否正确 我应该考虑的危险、限制和注意事项是什么?典型的“脏读”潜在问题是,查询可以“看到”尚未提交到数据库的更改,包括事务回滚时的重影记录。这可能意味着行在完全提交之前返回搜索结果。如果EF系统是写入数据库的数据的“看门人”,这可能不是什么大问题,因为重影只会在SaveCh

因为我的表记录上有很长时间的锁问题

在我的ASP.Net MVC web app和SQL Server数据库中,对Entity Framework 6的所有select查询使用“Read Uncommitted”事务隔离级别是否正确

我应该考虑的危险、限制和注意事项是什么?

典型的“脏读”潜在问题是,查询可以“看到”尚未提交到数据库的更改,包括事务回滚时的重影记录。这可能意味着行在完全提交之前返回搜索结果。如果EF系统是写入数据库的数据的“看门人”,这可能不是什么大问题,因为重影只会在SaveChanges调用期间出现,但如果使用事务作用域等并在作用域内保存更改,重影/脏数据可能会在整个事务作用域期间出现

当涉及到大量的读取操作(如搜索和报告)时,您可以选择针对为脏读设置的单独DbContext实例运行这些操作,但是您应该确保覆盖DbContext
SaveChanges
方法以引发异常,以防意外使用它进行写入。理想情况下,脏读的实体声明应该完全分开声明,以区分根据锁定规则读取的实体和可能脏读的实体。(不可靠)对于较大系统上的报告,我通常希望在单独的复制只读DB实例上运行

我建议首先考虑对所有大型只读操作(如搜索)使用投影,以便执行的查询只返回必要的数据,以及所有必要的数据,以避免低效查询急于加载不需要的数据或由于序列化等原因导致延迟加载,再次提取不需要的数据。这有助于确保不需要触摸的表不会被触摸(有可能出现锁问题),还有助于确保查询尽可能快地运行,从而减少锁问题的窗口长度。这通常足以使典型使用系统保持足够的响应能力,并且不会在搜索和读/写场景中遇到锁定问题。它还有助于优化搜索以尽可能利用索引,并避免用户过度释放查询,从而导致表扫描之类的结果。(速度慢且容易发生跳闸锁定问题)