所有 select 查询的 EF Read-Uncommitted
EF Read-Uncommitted for all select queries
由于我的 table 记录上存在非常持久的锁定问题...
在我的 ASP.Net MVC 网络中对 Entity Framework 6 的所有 select 查询使用“Read-Uncommitted”事务隔离级别是否正确?具有 SQL-服务器数据库的应用程序?
我应该考虑哪些危险、限制和注意事项?
典型的“脏读”潜在问题,其中尚未提交到数据库的更改可能会被查询“看到”,包括事务回滚的幻影记录。这可能意味着行在完全提交之前返回到搜索结果中。如果 EF 系统是写入数据库的数据的“看门人”,这可能不是什么大问题,因为幽灵只会在 SaveChanges 调用期间出现,但如果您使用事务范围等并保存范围内的更改,在事务范围的持续时间内可能会出现幻影/脏数据。
当涉及搜索和报告等繁重的读取操作时,您可以选择 运行 这些操作针对为脏读设置的单独 DbContext 实例,但您应该确保 DbContext SaveChanges
方法被覆盖以抛出异常以防止它被意外用于写入。理想情况下,脏读的实体声明应该完全分开,以区分根据锁定规则读取的实体与可能脏的实体。 (不可靠)当涉及到大型系统的报告时,我通常的目标是 运行 在单独的复制只读数据库实例上。
我建议首先考虑将投影用于所有大型只读操作(如搜索),以便执行的查询仅返回必要的数据,以及避免低效查询所需的所有数据不需要的数据或由于序列化等原因导致延迟加载,再次提取不需要的数据。这有助于确保不需要被触及的 tables 不会被触及(冒着锁定问题的风险)并且还有助于确保查询 运行 尽可能快,减少 window 锁定问题的长度。这通常足以让典型的使用系统保持足够的响应能力,而不是 运行 陷入搜索和 read/write 场景的锁定问题。它还有助于优化搜索以尽可能多地利用索引,并避免用户过度自由的查询,这可能导致 table-扫描之类的事情。 (速度慢且容易出现跳锁问题)
由于我的 table 记录上存在非常持久的锁定问题...
在我的 ASP.Net MVC 网络中对 Entity Framework 6 的所有 select 查询使用“Read-Uncommitted”事务隔离级别是否正确?具有 SQL-服务器数据库的应用程序?
我应该考虑哪些危险、限制和注意事项?
典型的“脏读”潜在问题,其中尚未提交到数据库的更改可能会被查询“看到”,包括事务回滚的幻影记录。这可能意味着行在完全提交之前返回到搜索结果中。如果 EF 系统是写入数据库的数据的“看门人”,这可能不是什么大问题,因为幽灵只会在 SaveChanges 调用期间出现,但如果您使用事务范围等并保存范围内的更改,在事务范围的持续时间内可能会出现幻影/脏数据。
当涉及搜索和报告等繁重的读取操作时,您可以选择 运行 这些操作针对为脏读设置的单独 DbContext 实例,但您应该确保 DbContext SaveChanges
方法被覆盖以抛出异常以防止它被意外用于写入。理想情况下,脏读的实体声明应该完全分开,以区分根据锁定规则读取的实体与可能脏的实体。 (不可靠)当涉及到大型系统的报告时,我通常的目标是 运行 在单独的复制只读数据库实例上。
我建议首先考虑将投影用于所有大型只读操作(如搜索),以便执行的查询仅返回必要的数据,以及避免低效查询所需的所有数据不需要的数据或由于序列化等原因导致延迟加载,再次提取不需要的数据。这有助于确保不需要被触及的 tables 不会被触及(冒着锁定问题的风险)并且还有助于确保查询 运行 尽可能快,减少 window 锁定问题的长度。这通常足以让典型的使用系统保持足够的响应能力,而不是 运行 陷入搜索和 read/write 场景的锁定问题。它还有助于优化搜索以尽可能多地利用索引,并避免用户过度自由的查询,这可能导致 table-扫描之类的事情。 (速度慢且容易出现跳锁问题)