我今天注意到我的應用程序出現了一些錯誤,它試圖在表中插入一條記錄,並且由於暫時的網絡延遲而收到超時錯誤。該應用程序的編碼是爲了識別這種情況,並在這種情況下重試,而這種情況很順利。但是在重試時,它經歷了主鍵違例 - 主要是因爲第一個插入語句實際上已經完成,但是發生了超時而將響應傳送回客戶端。應用程序認爲主鍵違規是嚴重的邏輯錯誤,不應該發生,因此會中止整個過程。什麼層應該負責處理超時到SQL Server的邏輯負責?
對我來說問題是什麼層在邏輯上應該負責處理這類事情?理想情況下,我會認爲SQL客戶端庫(在本例中爲ADO.NET 4.0)應該這樣做,但它沒有我知道的自動重試機制。鑑於它沒有,似乎有可能在SQL客戶端庫的低級別包裝器,但我不知道如果沒有更多的訪問有關超時發生時間的信息,它可以被寫入:例如,在這種例子中,可能的做法是:a)INSERT語句只是使用自動遞增鍵插入新記錄,因此在超時後重試會導致插入重複記錄,或b)主鍵違規事實上是一個邏輯錯誤,並且如果沒有發生超時,初始嘗試插入一條記錄會產生相同的違規行爲
OTOH我確信我能想到的例子是否只能確定是否重試在應用程序級別(尤其是如果它需要用戶確認的話)。
我實際上有些驚訝我以前從來沒有見過這個特別的錯誤序列,因爲它在實踐中似乎很有可能。
'XACT_ABORT'實際上與客戶端遇到運行時錯誤無關。它與語句的執行環境遇到運行時錯誤有關。如果事務遇到運行時錯誤(在服務器上),那麼它將中止並回滾整個事務。您的客戶端庫(如.NET中包含的庫)會由於缺陷而遇到運行時錯誤,並且SQL Server上的事務仍可能成功。 「XACT_ABORT」很可能不是默認的簡單符合OLE DB常見做法;原因可能是因爲一些性能的提升。 – 2014-02-19 04:22:26