2010-12-15 84 views
1

正如他們所說在收音機 - 長時間收聽者第一次來電....DataReader和SQLCommand

這是我的問題。 VS 2005 SQL Server 2005數據庫。 Windows窗體應用程序。 C#。大桌 - 780K記錄。我將它稱爲源表。需要循環訪問源表,併爲每個記錄對另一個表執行一些操作,然後將其寫回源表完成。我沒有得到儘可能更新第二個表尚未...

通過使用連接對象A.對於每個記錄使用DataReader源表中的所有記錄我環路我建立一個更新語句來更新源表以表明這個記錄已經被處理 - 並且使用SQL命令對連接對象B做這個uodate。所以不同的連接對象,因爲我知道dataReader想要獨佔。

這是問題所在。處理X記錄後 - 其中X似乎大約爲60 - 更新超時。

雖然寫這個 - 有趣的是如何發生這種情況是不是 - 我的大腦告訴我這是事務隔離和/或鎖定...即辦。我讀通過源記錄使用DataReader但改變的記錄...我可以看到不同的交易這造成的問題隔離,所以我會考慮這樣做......

任何人都看到了這一點,並知道如何解決它?

乾杯

皮特

回答

1

沒有更多的細節,解決方案的可能性非常多。正如iivel指出的那樣,您可以在數據庫本身內執行所有活動 - 如果這對於您必須執行的操作類型是可能的。我只是補充說,使用基於集合的操作而不是遊標來做這樣的事情是最好的。

如果必須在數據庫之外執行此操作,那麼您的源查詢可以在沒有任何鎖都被執行,如果這是你的情況做一個安全的事情。您可以通過設置隔離級別或通過在查詢中的表名/別名後添加with (nolock)來完成此操作。

還有其他幾個選項。例如,您可以批量操作,例如每次從源表中將1000條記錄拖入內存,斷開連接,然後執行所需的任何操作和更新。一旦處理了所有1000條記錄,則處理另一組1000條記錄,依此類推,直到處理完隊列中的所有記錄。

+0

不能在數據庫內完成 - 大量的邏輯RE更新我想用C#編寫的第二個表 - 並且已經有一些代碼。在回到這裏之前,我嘗試過nolock,並解決了這個問題。爲什麼下一個問題 - 使用nolock執行讀者使用的查詢不會阻止作者 - 那麼當我們不使用nolock時,這告訴我們什麼 - 源記錄在數據讀取器的持續時間內是否被鎖定? – 2010-12-15 03:20:09

+0

是的,記錄可能被鎖定在共享鎖上進行讀取(即爲了確保它們在讀取期間一致),所以不能對鎖定的記錄執行更新。其他連接將能夠查看記錄,但不修改它們。 – 2010-12-15 18:38:23

0

是否有任何理由不能在遊標中選擇/更新並將最終結果返回給應用程序?如果進程屬於數據庫,最好將其保留在那裏。

或者更新命令timout約翰mentionted是你唯一的其他選擇。

+0

感謝您的後 - 看到我的其他答案。這不是一個超時問題 - 某些鎖定/交易問題通過在源代碼上使用nolock來解決。乾杯皮特 – 2010-12-15 03:21:22