2009-12-13 53 views
2

在具有SQL Server故障轉移羣集或鏡像的環境中,您希望如何處理錯誤?好像有兩種選擇:處理由於服務器故障轉移而失敗的數據庫查詢

  1. 捨棄整個當前客戶端的請求,並讓用戶重試
  2. 捕獲的錯誤在你的DAL,並重新出現

每種方法都有其利弊和缺點。我與之合作過的大多數商店都是排名第一的,但其中許多商店也不遵循嚴格的交易限制,而且在我看來,如果發生失敗,我將面臨麻煩。即便如此,我在將它們轉換爲#2時遇到了困難,這也應該會帶來更好的用戶體驗(一種捕獲是發生故障轉移時可能存在的長時間延遲)。

任何參數或其他方式將不勝感激。如果您使用第二種方法,您是否有標準包裝程序來幫助簡化實施?無論哪種方式,您如何構建代碼以避免諸如與失敗的命令缺乏冪等相關的問題?

回答

0

2號可能是一個無限循環。如果它與網絡有關,或者本地PC需要重新啓動,或者其他什麼?

當然,1號令人討厭用戶。

如果您只允許通過網站訪問,那麼您將永遠不會看到錯誤,除非故障轉移發生在呼叫中。對我們來說,這不太可能,如果最終用戶沒有意識到,我們就會失敗。

在現實生活中,您可能沒有在Web服務器上清潔DAL。你可能有一個連接(大多數財務)或WinForms連接保持打開的Excel工作表,所以你只有一個選項。

無論如何,故障切換隻需要幾秒鐘。如果數據庫恢復比這更多,那麼無論如何你都有更大的問題。如果它經常發生,不得不考慮處理它,那麼...

總之,它會發生很少,你想知道和數字1會更好。恕我直言。

+0

難道你不能避免與重試計數器的無限循環?如果您的故障轉移只需要幾秒鐘,那麼您很幸運。我所使用的大多數基於SQL Server羣集的系統至少需要30秒才能將所有內容全部回滾,並且在備用服務器上的高速緩存填充時還會有額外的延遲 - 並且可能長達2分鐘。鏡子只有幾秒鐘,但我工作的大多數商店都沒有使用它們。 – RickNZ 2009-12-13 08:08:37

+0

通過幾個,我的意思是20-30秒:用戶不會注意到。什麼將是一個有效的重試計數?它處理超時,死鎖嗎?它只會重試強制斷開連接嗎? etc等 – gbn 2009-12-13 08:18:34

+0

我通常使用重試計數爲2,並在兩者之間延遲。這個想法不是爲了防止用戶看到錯誤;只是爲了儘量減少發生的機會。你如何確保在失敗後的同一頁失敗的命令發出之前插入成功?除了謹慎的交易設計之外,還有什麼? – RickNZ 2009-12-13 10:11:07