超时更新SQLDatareader正在读取的记录(有时)

时间:2012-10-15 08:42:41

标签: ado.net timeout sql-update sqldatareader

设置

我有一个简单的SQLDataReader,用于恢复给定表中的每一行。

我正在使用SQLDataReader,因为我希望保持内存占用率相对较低。

对于检索到的每一行,我对一些数据应用了一个简单的更改,并将其作为我立即执行的更新的基础。

通过这种方式,我可以将一个简单的计算函数应用于表中的每个记录。

什么时候有效?

这在我的本地数据库上运行正常。它也适用于位于另一台服务器上的测试数据库。

什么时候不起作用?

如果我恢复了实时数据库的副本,则该过程无法正常执行,在第一次尝试执行更新时遇到超时。

有什么不同?

LiveBackup和Test之间的唯一区别似乎是它中的记录数。 Test数据库有4823,LiveBackup有10182条记录。

此外,如果我在SQLDataReader中引入标准,以便从LiveBackup系统检索有限数量的记录(1000左右),它会立即开始工作

理论

似乎有可能会引入某种锁定,但实际上我看不到它在哪里。

我很欣赏我可以简单地将记录分成1000个批次,但这仍然让我无法理解究竟是什么导致了我的问题。

当我的SQLDatareader处理大量记录时,为什么在更新时发生超时(寻址单个记录)?

2 个答案:

答案 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选择不同的策略,行数越多)。看起来恢复表中每一行的查询是将表锁定在实时数据库中。

可以设置行锁定行为:

(注意这是一个SQL Server问题,而不是与ADO.NET有关的任何问题)