2012-06-19 20 views
1

我有以下的情况下(异常处理去除,代码简化):最小化SqlDataReader循环上的表锁定?

SqlDataReader rdr = executeQuery(query); 
while (rdr.Read()) { 
    //There are thousands of records, so this happens thousands of times 
    handleRecord(rdr); //Takes a couple of seconds 
} 
rdr.Close(); 

所以,表中查询涉及已共享锁了几个小时或更长时间(一个拥挤的SQL Server 2000上运行)取决于记录的数量。

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

因此,短期的明显

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); 
} 

,后者使极限上的记录,我可以对机器的内存处理量,还有没有其他的选择吗?

(这个程序,我慢慢移动到Dapper.NET,所以它已经为代码的其他部分的依赖性,如果有一个在小巧玲珑的东西,可能有这种情况有所帮助。)

+0

如果查询是用sql server查询提示no-lock执行的? –

+0

我希望数据尽可能最新,我知道在某些情况下使用提示可能会改变这种情况。 –

+0

但rList方法也将有陈旧的数据。 – Paparazzi

回答

0

会尽我评论作为没有最近评论的答案。

选择到#temp表中。并对你的锁定进行一般性评估。也许一些行锁。确保您以相同的顺序更新表格。是什么handleRecord看起来像

1

这是一个老话题,但这里有一个窍门我有时用?

  1. 订单上的主键SQL查询。
  2. 阅读顶部##记录。
  3. 读取/缓冲那些##记录。
  4. 使用您的缓冲区进行处理。
  5. 记住最高的ID。

回到2有一个修改:你读顶部##记录WHERE ID>最高ID。

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