的设置
我配置了一个简单的SQLDataReader,用于返回给定表中的每一行。
我使用SQLDataReader是因为我希望保持内存占用相对较低。
对于检索到的每一行,我都会对一些数据进行简单的更改,并将其作为立即执行的更新的基础。
通过这种方式,我可以将一个简单的计算函数应用于表中的每个记录。
它什么时候工作
这在我的本地数据库上运行良好。它在位于另一台服务器上的测试数据库上也能正常工作。
什么时候不起作用
如果我恢复我们的实时数据库的副本,该过程将无法正常执行,在第一次尝试执行更新时会遇到超时。
有什么不同
LiveBackup和Test之间的唯一区别似乎是其中的记录数。Test数据库有4823条记录,LiveBackup有10182条记录。
此外,如果我在SQLDataReader中引入标准,使其从LiveBackup系统中检索有限数量的记录(1000条左右),它将立即开始工作
理论
似乎有某种锁正在被引入,但我真的不知道在哪里。
我很感激我可以简单地将记录分解为1000个批次,但这仍然会让我不明白到底是什么导致了我的问题。
当我的SQLDatareader寻址大量记录时,为什么更新(寻址单个记录)会超时
SQL Server的页面大小是8K,所以当您尝试读取一个页面时,锁定可能会发生变化?
Bruce Barker在这里的回复有一些避免这种情况的提示:http://www.dotnet247.com/247reference/msgs/15/76467.aspx
但正如您所指出的,获取要批量更新的行是向前迈出的一步:-)
就我个人而言,如果让在本地获取要更新的数据,我会批量填充一个老式的DataSet/DataTable,并使用DataAdapter。然后,您也可以在批量写回更新时获得一些额外的效率:http://msdn.microsoft.com/en-us/library/aadf8fk2.aspx
您是否已经决定不可能在TSQL中进行更新?
听起来不同的环境之间有不同的隔离/行锁定级别,这就是为什么你会得到不同的行为(或者SQL Server选择不同的策略,行越多)。看起来,返回表中每一行的查询似乎正在锁定活动数据库中的表。
可以设置行锁定行为:
- 对整个数据库
- 或者仅仅在连接上
- 或者甚至在单个查询上,例如
SELECT * FROM MyTable WITH (NOLOCK)
(注意,因此,这更像是一个SQL Server问题,而不是与ADO.NET有关的任何问题)