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



的设置

我配置了一个简单的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有关的任何问题)

相关内容

  • 没有找到相关文章

最新更新