最小化SqlDataReader循環上的表鎖定?

.net c# dapper sql-server

我有以下方案(刪除了異常處理,簡化了代碼):

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,因此它已經是代碼其他部分的依賴項,以防Dapper中的某些東西可以幫助解決這個問題。)

熱門答案

這是一個古老的話題,但這是我有時使用的一個技巧:

  1. 在主鍵上訂購sql查詢。
  2. 閱讀熱門##記錄。
  3. 讀取/緩衝那些##記錄。
  4. 使用緩衝區進行處理。
  5. 記住最高的身份證。

通過一次修改返回到2:您閱讀頂部##記錄WHERE id>最高ID。

通過這種方式,您可以讀取和處理批量數據。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因