2012-10-15 36 views
1

的設置超時更新記錄通過一個SqlDataReader(有時)

我已經配置帶回每一行中給定的表的簡單SqlDataReader的讀取。

我正在使用SQLDataReader,因爲我正在尋找我的內存佔用相對較低。

對於檢索的每一行,我正在對一些數據進行簡單的更改,並將其作爲我立即執行的更新的基礎。

通過這種方式,我可以將簡單的計算函數應用於表中的每條記錄。

它什麼時候工作?

這工作正常我的本地數據庫。它也適用於位於另一臺服務器上的測試數據庫。

什麼時候不起作用?

如果我恢復我們的實時數據庫的副本,該進程無法正常執行,遇到第一次嘗試執行更新時的超時。

有什麼不同?

LiveBackup和Test之間的唯一區別似乎是其中的記錄數。測試數據庫有4823個,LiveBackup有10182個記錄。

而且,如果我介紹的標準到從LiveBackup系統SqlDataReader的,使得其檢索的記錄數量有限(1000左右),它立即開始工作

理論

這很可能有一些鎖被引入,但我真的不知道在哪裏。

我明白,我可以簡單地將記錄分成1000個批次,但這仍然讓我不知道究竟是什麼導致了我的問題。

爲什麼當我的SQLDatareader尋址大量記錄時,更新(這是尋址單條記錄)時發生超時?

回答

2

SQL服務器頁面大小是8K,所以也許當你嘗試讀取了一個頁面鎖定改變?這裏

布魯斯·巴克的答覆有一些提示,以避免這種情況: http://www.dotnet247.com/247reference/msgs/15/76467.aspx

但正如你指出的那樣,獲取行批量更新是向前邁進了一步:-)

個人,如果你本地更新的數據,我會批量填充一箇舊的DataSet/DataTable,也使用DataAdapter。然後,您可以在批量寫回更新時獲得一些額外的效率: http://msdn.microsoft.com/en-us/library/aadf8fk2.aspx

您是否已經決定在TSQL中執行更新是不可能的?

1

聽起來像你在不同的環境之間有不同的隔離/行鎖定級別,這就是爲什麼你得到不同的行爲(或SQL Server選擇不同的策略,有更多的行)。它看起來好像返回表中的每一行的查詢都將表鎖定在實時數據庫中。

行鎖定行爲可設置爲:

(注意:因此,這更多的是一種SQL Server的問題比什麼用ADO.NET做)