【发布时间】:2012-06-19 16:38:04
【问题描述】:
我有一个返回大量数据的进程(提交时要求大约 50-100k 个实体)
我在Commit(工作单元模式)之前执行所有Adds。我并没有太在意提交实际需要多长时间——这个过程运行时间很长(几周),所以这里一分钟或者世界末日不是世界末日,而是在提交期间,使用相同抽象实体和上下文的第二个应用程序无法从数据库表中读取数据并最终超时。
如果我等到提交发生并尝试从应用 #2 再次读取,它几乎可以立即工作。
那么,我如何告诉 EF 在提交期间不要锁定表(大概是它在做什么?)?
关键代码在这里:
Dim DBTask = TaskRepository.Single(function(x) x.Id = CurrentTaskId)
''Task is a class which stores the results from the process before committing them
For Each Result In Task.Results
Dim DbResult = TaskResultRepository.CreateInstance
DbResult.Field1 = Result.Field1
DbResult.Field2 = Result.Field2
DbTask.Results.Add(DbResult)
Next
DbTask.JobStatus = Entities.JobStatuses.Completed
QLog.DebugFormat("Committing Task {1}: {0}", Task.Name, Task.Id)
UnitOfWork.Commit()
Tasks.Remove(Task)
QLog.InfoFormat("End Task {1}: {0}", Task.Name, Task.Id)
更糟糕的是,我目前缺乏工具,因为有人放错了 SQL Server 安装磁盘,所以没有 Management Studio/Performance Analyser,只有服务器资源管理器。
供参考,我的Repository(Of T As Entitybase).CreateInstance方法是:
Protected ReadOnly Entities As IDbSet(Of T)
Public Function CreateInstance() As T Implements Interfaces.IRepository(Of T).CreateInstance
Dim Entity = Entities.Create(Of T)()
With Entity
.CreatedOn = Now
End With
Entities.Add(Entity)
Return Entity
End Function
【问题讨论】:
-
@a_horse 不知道为什么我自己没有添加那个,谢谢
-
我正要回答 SELECT 永远不应该被挂起的事务阻塞,但后来我看到你提到 SQL Server 哪种解释了这种行为。
-
为了澄清,收集数据的后台线程可能需要数周才能运行。由于目前的架构方式,在流程完成之前不会提取数据。花费时间的不是提交(大约 10 分钟)
标签: .net sql-server entity-framework ef-code-first