2010-09-18 100 views
0

在我的網站的每個頁面上,令牌都作爲查詢字符串參數傳入。服務器端代碼檢查數據庫中是否已存在令牌。 (令牌是數據庫中的uniqueidentifider字段)。如果令牌存在,那麼它將使用現有的令牌,否則它將使用新令牌創建一個新行。網站數據庫重複記錄

問題是有一次,我在數據庫中看到一個重複的記錄(兩行具有相同的uniqueidentifider)。我注意到插入記錄的時間相差約半秒。我唯一的猜測是當網站首次被訪問時,aspx頁面沒有完全編譯。因此,它需要幾秒鐘的時間,用戶通過輸入不同的網址轉到網站的另一個頁面,兩個請求幾乎同時被執行。

有沒有辦法來防止這種重複的記錄問題發生? (在服務器端或數據庫中......)

這是網站每頁的一部分問題中的代碼。

var record = (from x in db.Items 
      where x.Token == token 
      select x).FirstOrDefault(); 

if (record == null) 
{ 
    var x = new Item(); 
    x.Id = Guid.NewGuid(); 
    x.Token = token; 
    db.Items.InsertOnSubmit(x) 
    db.SubmitChanges; 

} 

回答

0

是的,你的token領域開創一片唯一索引

create unique index tab_token on your_table(token); 

這樣,數據庫將確保你永遠不會存儲兩個記錄具有相同token值。請記住,由於索引限制,運行此代碼時可能會失敗,因此請確保您在代碼中捕獲該異常並相應地對其進行處理。

可能發生的情況是,兩個請求在同一時間完成服務,一些競速條件導致兩個令牌獲得相同的值。如果您發佈了一些代碼,這將有助於識別您的問題。