2009-08-24 75 views
2

我有兩個表,A和B和一個簡單的表X,它們保持兩者之間的關係。 X包含AID和BID作爲其主鍵。我應該忽略數據庫插入的異常嗎?

我使用LINQ到SQL插入像一個關係:

public void InsertRelationship(int y, int z) { 
    DataContext.X.InsertOnSubmit(new x { AID = y; BID = z }); 
} 

的問題是,兩次調用InsertRelationship()可在極端情況下調用這樣一個異常會因拋出重複的記錄。這對我來說並不重要,因爲我知道這種關係是存在的,所以我忽略了這個例外。

是否還好忽略這種情況下的例外或者是它仍然不好的做法?我應該在插入之前檢查關係是否已經存在?這會如何影響性能?

更新

重複的調用InsertRelationship()無法避免。它是一個Web應用程序,所以我不能阻止用戶打開兩個單獨的窗口並例如調用該方法兩次。該方法不會通過典型的用戶交互被調用兩次,但我在這裏針對極端情況進行編程。重複的百分比可能會很低,但我還不確定確切的數字。

回答

2

只是忽略異常的主要問題是,可能會針對與您不想隱藏的重複記錄完全不相關的其他問題引發異常,例如SQL超時或死鎖等。

最好的解決辦法是構建應用程序,以便將受騙者插入不會發生,下一個最好的是做插入之前檢查它們的存在。

如果性能至關重要,無法避免死鎖插入,死鎖插入與工作插入的比例非常小,並且您可以知道引發的異常只是由於重複問題所致,您可能更適合捕獲例外並忽略它。但是,這是一個如果與很多條件:-)

2

一般來說,你應該先檢查。

但可能更準確的說,是你要構建的界面應用程序,使得它不存在它甚至有可能,通過典型的用戶交互的情況下,甚至產生你需要的情況下檢查。

無論如何,更好的做法是檢查。

+0

由於這是一個Web應用程序,我無法避免用戶可能調用該方法兩次的可能性。我已經更新了這個問題。 – 2009-08-24 07:49:44

+0

正如我所說,無論如何,最好檢查並向他們返回一個不錯的錯誤。 – 2009-08-24 07:51:06

0

如果您確信不僅是因爲它已經存在,應該沒關係的記錄未插入。其他明智的忽略異常可能會隱藏其他危險。

2

就性能而言,投擲異常很昂貴。另外,你所得到的例外永遠不會保證每次都有相同的原因。您應該始終在再次添加之前檢查該行是否存在,因爲您知道該問題可能首先存在。

例外是特殊情況 - 這也不例外,這是一個用於創建數據的正常流程的一部分。

+0

「投擲異常很貴」,是否比檢查記錄每次都不存在更昂貴?重複呼叫的次數可能少於2%。 – 2009-08-24 07:52:47

+0

直到您有確鑿的證據證明首先檢查數據庫實際上導致該領域的問題時,我纔會擔心性能 - 直到此時,您在這方面做的任何事情都是不成熟的優化。首先檢查是遵循的最佳模式,因爲代碼的意圖是清晰的,而且您不忽略忽略異常的信息。 – Sam 2009-08-24 23:57:15

1

雖然不太可能,不檢查,然後插入一條記錄的競爭條件?如果是這樣,你應該爲它進行防守編程,這意味着捕捉和檢查任何異常情況。

在這種情況下,您應該在選擇忽略它之前檢查異常的類型和/或它的基礎錯誤編號。通過這種方式,您可以忽略與試圖插入重複記錄相關的異常(可能是主鍵約束衝突)。你會想要以不同的方式處理其他類型的異常。