C# 最小化SqlDataReader循环上的表锁定?

C# 最小化SqlDataReader循环上的表锁定?,c#,.net,sql-server,dapper,C#,.net,Sql Server,Dapper,我有以下场景(删除异常处理,简化代码): 因此,查询涉及的表(在过度拥挤的SQLServer2000上运行)具有几个小时或更长时间的共享锁,这取决于记录的数量 这些锁有时会影响查询此数据库的其他应用程序,因此要求我尽快删除这些锁 所以,除了显而易见的 List<Record> rList = new List<Record>(); SqlDataReader rdr = executeQuery(query); while (rdr.Read()) { //Ther

我有以下场景(删除异常处理,简化代码):

因此,查询涉及的表(在过度拥挤的SQLServer2000上运行)具有几个小时或更长时间的共享锁,这取决于记录的数量

这些锁有时会影响查询此数据库的其他应用程序,因此要求我尽快删除这些锁

所以,除了显而易见的

List<Record> rList = new List<Record>();
SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
   //There are thousands of records, so this happens thousands of times
   storeRecord(rList,rdr); //Takes milliseconds
}
rdr.Close();
foreach (Record r in rList) {
    handleRecord(r);
}
List rList=new List();
SqlDataReader rdr=executeQuery(查询);
while(rdr.Read()){
//有数千条记录,所以这种情况发生了数千次
storeRecord(rList,rdr);//需要毫秒
}
rdr.Close();
foreach(在rList中记录r){
handleRecord(r);
}
这将限制我可以在机器内存中处理的记录数量,还有其他选择吗


(这个应用程序我正在慢慢地转到Dapper.NET,因此它已经是代码其他部分的依赖项,以防Dapper中有什么东西可以帮助解决这个问题。)

将尝试我的评论作为答案,因为最近没有评论


选择一个临时表格。并对你的锁进行全面检查。也许是一些排锁。确保以相同的顺序更新表。HandlerRecord是什么样子的?在

中,将尝试我的评论作为答案,因为最近没有评论


选择一个临时表格。并对你的锁进行全面检查。也许是一些排锁。确保以相同的顺序更新表。HandlerRecord是什么样子的?在

中,这是一个老话题,但我有时会使用以下技巧:

  • 按主键排序sql查询
  • 阅读顶部记录
  • 读取/缓冲那些记录
  • 使用缓冲区进行处理
  • 记住最高的id
  • 通过一个修改返回到2:读取id>最高id的顶部##记录


    通过这种方式,您可以读取和处理成批数据。

    这是一个老话题,但我有时会使用以下技巧:

  • 按主键排序sql查询
  • 阅读顶部记录
  • 读取/缓冲那些记录
  • 使用缓冲区进行处理
  • 记住最高的id
  • 通过一个修改返回到2:读取id>最高id的顶部##记录


    通过这种方式,您可以读取和处理成批数据。

    如果使用sql server查询提示执行查询,则不锁定?我希望数据尽可能是最新的,我理解在某些情况下使用提示可能会改变这一点。但是rList方法也会有过时的数据。@bum By-update我的意思是最新的“我希望数据100%有效“使用NOLOCK,我可以读取未提交的事务。事实证明,我不仅可以读取未提交的事务,还可以获取重复的行,甚至可以消除查询错误。如果查询是使用sql server查询提示no lock执行的?我希望数据尽可能是最新的,我知道在某些情况下使用提示可能会改变这一点。但是rList方法也会有过时的数据。@bum By-update我的意思是“我希望数据100%有效”使用NOLOCK,我可以读取未提交的事务,结果证明,我不仅可以读取未提交的事务,还可以获取重复的行,甚至可以消除查询错误。
    List<Record> rList = new List<Record>();
    SqlDataReader rdr = executeQuery(query);
    while (rdr.Read()) {
       //There are thousands of records, so this happens thousands of times
       storeRecord(rList,rdr); //Takes milliseconds
    }
    rdr.Close();
    foreach (Record r in rList) {
        handleRecord(r);
    }