请参阅以下代码:
Public Class Form1
Private _ConString As String
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim objDR As SqlDataReader
Dim objCommand As SqlCommand
Dim objCon As SqlConnection
Dim id As Integer
Try
_ConString = ConfigurationManager.ConnectionStrings("TestConnection").ToString
objCon = New SqlConnection(_ConString)
objCommand = New SqlCommand("SELECT * FROM Person")
objCommand.Connection = objCon
objCon.Open()
objDR = objCommand.ExecuteReader(ConnectionState.Closed)
Do While objDR.Read
ProcessPerson(objDR("URN"))
Loop
objDR.Close() 'line 16
Catch ex As Exception
throw
Finally
End Try
End Sub
End Class
假设Person表中有一百万条记录,运行需要24小时。假设我删除了Person表或显着更新了表中的数据。它会继续处理一百万条记录吗?请假设ProcessPerson不使用Person表。
我花了一些时间谷歌搜索,但我没有找到答案。
答案 0 :(得分:0)
找出在某种情况下是否会发生某事的最佳方法就是测试它。这打败了所有文档,因为偶尔文档(无论是“官方”MSDN和/或TechNet页面,博客文章等)是不正确的。您已经编写了应用程序代码,因此在[Person]
表中输入1-2百万行是一件相当简单的事情。如果PK字段之外的所有字段都与您测试简单效果的字段相同,那么应该没问题。或者,也许确保至少有一个字段具有唯一值,以便更容易查看是否缺少某些内容。然后只需运行您在此处发布的代码并删除一些目标行,看看它们是否存在于您的集合中。
完成该测试后,请查看启用Snapshot Isolation,因为它旨在帮助解决此问题。如果这个过程可能需要24小时,那么你可能不应该将它包装在一个交易中(好吧,如果你想保住你的工作;-))。
另一种选择是创建执行以下操作的存储过程:
只要应用程序读取它,它就会分离并保留您的结果集。但它也会复制[tempdb]中的完整结果集,而快照隔离:
只使用它所需的空间,如果行没有那么多变化,那么空间将比完整结果集少得多,
在初始查询运行时阻止阻塞,这在填充临时表时可能仍会发生