我有多個客戶端通過不可靠(無線/ gprs)網絡連接到SQL Server,並在幾分鐘內執行大量小型查詢並插入。如果在此過程中網絡連接中斷,整個事務將回滾並需要重新啓動。由於業務需求,流程必須是事務性的(即其他客戶端可以看到來自其他客戶端的完整數據集或根本看不到它)。在IP更改後重新連接丟棄的SqlConnection而不回滾事務
我希望能夠檢測到連接中斷並能夠重新連接到SQL Server,並在剛剛被刪除的同一個事務中繼續處理,並避免從頭開始重新啓動。在我使用sp_getbindtoken
打開連接之後的那一刻,設置CommandTimeout
小的值(比TCP保持活動小很多),如果我在ExecuteNonQuery
得到超時,我打開服務器新的連接和呼叫sp_bindsession
從過程的開始標誌。然後我繼續使用綁定到前一個進程事務的會話的新連接進程。
到目前爲止,這是工作幾乎完全,但根據MSDN,這個API已被棄用,並且將在SQL Server的未來版本中刪除。問題是:如果沒有這兩個命令,我怎麼能達到相同的結果?是否有任何其他方式從丟棄的TCP連接恢復事務?
編輯/更多信息:客戶端應用程序在帶有條形碼掃描儀的Windows CE設備上運行。我提供設備和軟件,所以我可以隨意放置任何我需要的東西。 DB由第三方託管在受保護的環境中,我和客戶都無法控制它。我總共發送約50MB的日常銷售數據。我可以使用SP來保存數據,但它仍然需要傳輸,並且有一個大參數的SP對GPRS/EDGE鏈路的成功機率可能接近0%。
由於整個解決方案在生產環境中工作,我希望保持更改爲最小。與sp_bindsession
具有相同語義的替代API將是完美的。
您是否考慮過製作客戶端服務器應用程序,以便TSQL發生在硬連接到SQL服務器(或與SQL服務器相同的設備)的服務器上? – Paparazzi
@BalamBalam:是的,我創建了自己的實現IDbConnection的類,並將所有方法調用(緩衝)轉發給定製服務器,並在SqlConnection上調用適當的方法。隧道是使用.NET Remoting通道完成的,並且足夠強大。不幸的是,現在應用程序部署在我無法在DB服務器上或附近放置自定義代碼的環境中,所以我不得不使用純粹的TSQL解決方案。 – MagnatLU
多個無線客戶端上的自定義代碼正常,但單個有線框上的自定義代碼不正常。這是一種奇怪的安全邏輯。邏輯或不是這聽起來像一個硬性約束。由於交易被設計爲回滾到開始,所以這至少會有問題。你真的在客戶端的.net上運行交易嗎?您可以將事務移動到服務器上的存儲過程嗎? – Paparazzi