设置
我有一个简单的SQLDataReader,用于恢复给定表中的每一行。
我正在使用SQLDataReader,因为我希望保持内存占用率相对较低。
对于检索到的每一行,我对一些数据应用了一个简单的更改,并将其作为我立即执行的更新的基础。
通过这种方式,我可以将一个简单的计算函数应用于表中的每个记录。
什么时候有效?
这在我的本地数据库上运行正常。它也适用于位于另一台服务器上的测试数据库。
什么时候不起作用?
如果我恢复了实时数据库的副本,则该过程无法正常执行,在第一次尝试执行更新时遇到超时。
有什么不同?
LiveBackup和Test之间的唯一区别似乎是它中的记录数。 Test数据库有4823,LiveBackup有10182条记录。
此外,如果我在SQLDataReader中引入标准,以便从LiveBackup系统检索有限数量的记录(1000左右),它会立即开始工作
理论
似乎有可能会引入某种锁定,但实际上我看不到它在哪里。
我很欣赏我可以简单地将记录分成1000个批次,但这仍然让我无法理解究竟是什么导致了我的问题。
当我的SQLDatareader处理大量记录时,为什么在更新时发生超时(寻址单个记录)?
答案 0 :(得分:2)
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中进行更新?
答案 1 :(得分:1)
听起来你在不同的环境之间有不同的隔离/行锁定级别,这就是你获得不同行为的原因(或者SQL Server选择不同的策略,行数越多)。看起来恢复表中每一行的查询是将表锁定在实时数据库中。
可以设置行锁定行为:
SELECT * FROM MyTable WITH (NOLOCK)
(注意这是一个SQL Server问题,而不是与ADO.NET有关的任何问题)