2011-04-18 104 views

回答

2

這個Azure論壇主題有一些鏈接到很好的資源,涵蓋了這個主題。目前似乎還沒有任何「官方」的東西。但是有一些開源項目會給你一個很好的開始。

http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/3a9ed384-5374-438e-a8a4-ff4bd8000738/#27b5251a-bff5-4282-980c-ad43fdd85591

從答案:

http://blogs.msdn.com/b/appfabriccat/archive/2010/10/28/best-practices-for-handling-transient-conditions-in-sql-azure-client-applications.aspx

我個人沒有使用博客中提到的庫。相反,我能夠通過一個TRY/CATCH的簡單WHILE LOOP來避開可以安全重試的特定SQL EXCEPTION錯誤號。還有一個基本上阻止它「永久重試」的計數器。

+0

感謝Vyrotek,你能分享你的while循環try/catch嗎? – 2011-04-20 02:31:47

9

我使用的是Transiet Fault Handling Framework,EF團隊提供了一個更好的解決方案。

  • 將上述鏈接中的二進制文件或項目添加到您的解決方案中,並將該參考添加到您的項目中。
  • 實例化一個重試政策,適當的參數:

var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
      10, 
      TimeSpan.FromSeconds(0.5), 
      TimeSpan.FromSeconds(2) 
    ) { FastFirstRetry = true }; 
  • 使用您的重試策略對象上context任何原子的工作。

using(var context = new ...) 
    { 
     ...//Maybe you do something to the database... 
     retryPolicy.ExecuteAction(() => context.SaveChanges()); 
    } 
+1

+1我知道這個問題現在已經很老了,但提到瞬態故障處理框架的工作很好。我一直在生產中使用它一段時間,它對我來說非常適合。 – 2011-08-09 12:15:46

+1

如果您在TransactionScope中執行SaveChanges(),則必須非常小心,因爲在這種情況下,EF不會將SaveChanges包裝在BEGIN/COMMIT塊中,而是依賴於事務範圍的BEGIN/COMMIT(嘗試使用SQLServer分析器查看我的意思)。因此,如果SaveChanges()執行了5次插入,並且一次失敗,則重試可能會重新插入沒有問題的4次。這可能是EF 6連接彈性不允許用戶定義的事務的原因:[參見](http://msdn.microsoft.com/zh-cn/data/dn307226) – JohnB 2014-10-02 14:29:54

1

將Windows Server AppFabric的客戶顧問團隊已經在this blog post提供圍繞重一些相當詳細的指導。

基本上,他們已經有很多不同的方式來使用瞬態故障處理框架(它已經被類似的Transient Fault Handling Application Block所取代)以提供重試。

3

根據大多數文檔使用瞬態故障處理庫的問題是,它迫使您在應用程序中封裝每個數據庫調用。

如果您使用實體框架6(目前處於alpha)則是與Azure的SQL數據庫瞬態重試一些新的內置支持(與配置的一點點):這裏是link

我我們創建了一個庫,允許您配置實體框架使用故障處理模塊進行重試,而無需更改每個數據庫調用 - 通常您只需更改配置文件以及可能的一兩行代碼即可。

這可以讓你使用它的實體框架或LINQ to SQL的,這裏是link