1

设置

我有一个简单的 SQLDataReader 配置为带回给定表中的每一行。

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

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

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

它什么时候起作用?

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

什么时候不起作用?

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

有什么不同吗?

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

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

理论

似乎有可能引入了某种锁,但我真的看不出在哪里。

我很感激我可以简单地将记录分成 1000 个批次,但这仍然会让我不明白究竟是什么导致了我的问题。

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

4

2 回答 2

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 中进行更新?

于 2012-10-15T10:21:25.487 回答
1

听起来你在不同的环境之间有不同的隔离/行锁定级别,这就是为什么你会得到不同的行为(或者 SQL Server 选择不同的策略,行越多)。看起来好像带回表中每一行的查询正在将表锁定在您的实时数据库中。

可以设置行锁定行为:

(因此请注意,这更像是一个 SQL Server 问题,而不是与 ADO.NET 相关的任何问题)

于 2012-10-15T09:47:30.223 回答