【问题标题】:DataReader and SQLCommandDataReader 和 SQLCommand
【发布时间】:2010-12-15 01:39:19
【问题描述】:

正如他们在广播中所说的 - 长时间的听众第一次来电......

这是我的问题。 VS 2005 SQL Server 2005 数据库。 Windows 窗体应用程序。 C#。大表 - 780K 记录。我将其称为源表。需要循环遍历源表,并为每条记录对另一个表做一些事情,然后写回源表它已完成。我还没有更新第二张表...

我使用数据读取器使用连接对象 A 循环遍历源表的所有记录。对于每条记录,我构建一个更新语句来更新源表以指示该记录已被处理 - 并对连接对象 B 使用 SQL 命令做这个uodate。如此不同的连接对象,因为我知道 dataReader 想要独占。

这就是问题所在。在处理 X 条记录后 - X 似乎约为 60 - 更新超时。

在写这篇文章时——这很有趣,不是吗——我的大脑告诉我这与事务隔离和/或锁定有关......即我正在使用数据读取器读取源记录,但更改了这些记录...我可以看到这会导致不同事务隔离出现问题,所以我会调查一下...

有人看到这个并且知道如何解决吗?

干杯

皮特

【问题讨论】:

    标签: c# .net connection datareader sqlcommand


    【解决方案1】:

    没有更多细节,解决方案的可能性非常多。正如iivel 所指出的,您可以在数据库本身内执行所有活动——如果这对于您必须执行的操作类型是可能的。我只想补充一点,最好使用基于集合的操作而不是游标来做这样的事情。

    如果您必须在数据库之外执行此操作,那么您的源查询可以在没有任何锁的情况下执行,如果在您的情况下这样做是安全的。您可以通过设置隔离级别或在查询中的表名/别名后简单地附加 with (nolock) 来做到这一点。

    还有其他几个选项。例如,您可以分批操作,例如一次将 1000 条记录从源表中拉入内存,断开连接,然后执行您需要的任何操作和更新。处理完所有 1000 条记录后,处理另一组 1000 条记录,以此类推,直到队列中的所有记录都已处理完毕。

    【讨论】:

    • 无法在数据库中执行此操作 - 大量逻辑 RE 更新我想用 C# 编写的第二个表 - 并且已经有了一些代码。我在回到这里之前尝试了 nolock,这已经解决了这个问题。为什么下一个问题 - 使用 nolock 执行读取器使用的查询不会阻塞写入器 - 那么当我们不使用 nolock 时,这告诉我们什么 - 源记录在数据读取器的持续时间内被锁定?跨度>
    • 是的,记录很可能被共享锁锁定以进行读取(即确保它们在读取期间保持一致),因此无法对锁定的记录执行更新。其他连接将能够查看记录,但不能修改它们。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      是否有任何原因您不能在游标中进行选择/更新并将最终结果计数返回给应用程序?如果进程属于数据库,最好将其保留在那里。

      如 John 所说,交替更新命令 timout 是您唯一的选择。

      【讨论】:

      • 感谢您的帖子 - 请参阅我的其他答案。这不是超时问题 - 一些锁定/事务问题已通过在源上使用 nolock 修复。干杯皮特
      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 2014-08-30
      • 1970-01-01
      • 2016-06-30
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多